一、概念
linux內(nèi)存
嵌入式
嵌入式以計(jì)算機(jī)應(yīng)用為中心,軟硬件可裁剪的,對功耗,功能體積,可靠性等有要求的專用的計(jì)算機(jī)系統(tǒng)。
嵌入式層次圖
user:(用戶空間)
命令 shell腳本 APP(glibc)
-----------------------------
命令行解析器
| [0-3G]
---------------系統(tǒng)調(diào)用-----------------------------
kernel:(內(nèi)核層)
5大功能 | [3-4G]
1.進(jìn)程管理 //有進(jìn)程的創(chuàng)建、銷毀與調(diào)用
2.內(nèi)存管理 //內(nèi)存申請、釋放
3.文件管理
4.網(wǎng)絡(luò)管理
5.設(shè)備管理 //設(shè)備驅(qū)動(dòng)管理
hardware: (硬件層)
led camera sensor lcd sound
linux系統(tǒng):分時(shí)多任務(wù)/多用戶操作系統(tǒng) linux系統(tǒng)一切皆文件
用戶空間進(jìn)入內(nèi)核需要使用系統(tǒng)調(diào)用完成,系統(tǒng) 調(diào)用接口是內(nèi)核已經(jīng)給用戶提供了。linux分為用戶 空間和內(nèi)核空間的原因是處于安全角度考慮。
判斷小端和大端
在我們發(fā)送數(shù)據(jù)的時(shí)候,我們首先要確定是大端還是小端模式來進(jìn)行的,在接收方接收的數(shù)據(jù)必須知道數(shù)據(jù)是大端還是小端模式,才能正確地讀取和存儲(chǔ)數(shù)據(jù)起來,否則就會(huì)出錯(cuò)
小端:ubuntu用的一般是小端
大端:數(shù)據(jù)通過網(wǎng)絡(luò)字節(jié)區(qū)
代碼區(qū)分:
#include <stdio.h>
union aa{ /* 使用共用體判斷 */
unsigned char a;
unsigned int b;
};
int main(void)
{
union aa tt;
tt.b = 0x12345678;
if(tt.a == 0x78){
printf("小端\n");
}else if(tt.a == 0x12){
printf("大端\n");
}
return 0;
}
二、linux系統(tǒng)操作命令
ls查看
- ls -a // 顯示隱藏文件
- ls -l // 列出文件屬性
- ls -lh // 列舉文件的時(shí)候?qū)⑽募膶傩孕畔⒁徊@示,并把文件的大小按照單位顯示
- ls -i // 顯示文件的inode號,文件系統(tǒng),唯一識別文件的一個(gè)序號
- ls -R // 遞歸顯示所有文件,包括子目錄文件
cd 命令
- cd ~ 或cd 回到家目錄下
- cd - 回到上一次操作的目錄下
- cd / 切換到根目錄下
- cd . 切換到當(dāng)前目錄下
- cd …/ 切換到上一級目錄下
pwd命令
顯示當(dāng)前的路徑
touch 創(chuàng)建文件
touch 文件名
如果文件存在,更新文件的時(shí)間戳
如果文件不存在,創(chuàng)建文件
touch 文件1 文件2 文件3 …
同時(shí)創(chuàng)建多個(gè)文件
mkdir 創(chuàng)建目錄
mkdir 目錄名 //用來創(chuàng)建目錄
mkdir -p 1/2/3 創(chuàng)建具備層級關(guān)系的目錄
mkdir -m 0777 list 創(chuàng)建一個(gè)具備0777權(quán)限的目錄
chmod 修改權(quán)限
chmod 權(quán)限 文件/目錄
例:
chmod 0777 hello/
將hello目錄的權(quán)限修改為0777
chmod 0441 2.c
將2.c的文件的權(quán)限修改為0441
man命令
man 1 ==>查看命令幫助手冊
例 :
man 1 ls
man 2 ==>查看系統(tǒng)調(diào)用的幫助手冊
例:
man 2 open ==>查看系統(tǒng)調(diào)用函數(shù)open
man 3 ==> 查看庫函數(shù)的幫助手冊
例:
man 3 fflush
man 7 ==> 查看網(wǎng)絡(luò)相關(guān)的幫助手冊
例:
man 7 ip
man 7 socket
cp 拷貝
cp 文件/目錄 目錄
將文件或者目錄拷貝到某一個(gè)目錄下
cp 絕對路徑/文件名 目錄名
cp 相對路徑/文件名 目錄名
將一個(gè)文件拷貝到目標(biāo)目錄下
拷貝目錄需要加-r 或 -a
cp 絕對路徑/目錄名 目錄名 -r 或 -a
cp 相對路徑/目錄名 目錄名 -r 或 -a
將一個(gè)目錄拷貝到目標(biāo)目錄下
cp ./COPYING ~/test.c
將COPYING文件拷貝到家目錄下并重命名為test.c
cp ./net ~/1/2/3/aaa -r
拷貝目錄的同時(shí)進(jìn)行重命名
例:
1.在用戶的家目錄下,創(chuàng)建一個(gè)my-dir目錄
cd
mkdir my-dir
2.將/etc下的passwd文件拷貝到my-dir目錄下,并重命名為farsight.c
$ cp /etc/passwd ~/my-dir/farsight.c
3.將etc下的groff目錄拷貝到my-dir下,并重命名為hello
cp /etc/groff/ ~/my-dir/hello -r
mv 移動(dòng)
如果目標(biāo)目錄存在表示移動(dòng),如果不存在重命名
mv 文件/目錄 目標(biāo)目錄下
mv 1.c ~
//將當(dāng)前的1.c文件移動(dòng)到/home/linux下
mv hello/ ~/1/2/3 (注意不需要加-r)
//將當(dāng)前目錄下的hello目錄,移動(dòng)到1/2/3目錄下
重命名:
mv test.c farsight.c
將test.c重命名為farsight.c文件
mv net/ netnet/
將net目錄重命名為netnet目錄
例:
1.在用戶的家目錄下,創(chuàng)建一個(gè)my-dir1目錄
cd
mkdir my-dir1
2.將/etc下的passwd文件拷貝到my-dir1目錄下,并重命名為farsight.c (不使用cp重命名)
cp /etc/passwd ~/my-dir1/
mv passwd farsight.c
3.將etc下的groff目錄拷貝到my-dir1下,并重命名為hello (不使用cp重命名)
cp /etc/groff/ ~/my-dir1/ -r
mv groff/ hello/
4.將my-dir1移動(dòng)到共享目錄下
mv ~/my-dir1 /mnt/hgfs/share
rm命令
rm 文件名 //刪除文件
rm 目錄名 -rf //刪除目錄 -r 遞歸刪除
//-f 強(qiáng)制刪除
rm *.c -f //強(qiáng)制刪除所有的.c文件
例:
rm !(22.txt) //刪除22.txt之外的所有的文件
cat命令
cat 命令用于查看文件內(nèi)容,后跟文件名作為參數(shù)。
cat -n //顯示每一行的行號
more命令一頁一頁顯示文件內(nèi)容,用法與cat一致
more在命令會(huì)在最后顯示一個(gè)百分比,表示已顯示內(nèi)容占整個(gè)文件的比例。按空格鍵向下翻動(dòng)一頁,按Enter鍵向下滾動(dòng)一行,按Q鍵退出
echo 命令
- echo “123123” 將字符串顯示到終端上
- echo 123123 > 1.c //重定向,本來要在終端上顯示的字符串,重定/向到1.c
- echo 123123 >> 1.c //>>追加,在文件的尾部新起一行,將字符串寫入這一行
例:
在終端輸入echo $? ==>可以查看int main函數(shù)的返回值
tty命令->查看當(dāng)前終端號
clear 命令
清屏 或者 ctrl + l
ldd命令 ->查看文件依賴哪些庫
ldd + 文件名
printenv命令->打印環(huán)境變量
eog命令 + 圖片名-> 顯示圖片
權(quán)限掩碼 umask命令
修改權(quán)限掩碼
umask 0(把權(quán)限掩碼去掉)
安裝軟件命令
linux軟件包的管理
(1)rpm(redhat)
(2)deb(ubuntu)
在.deb這個(gè)軟件包中包含可執(zhí)行程序,
說明文檔,man手冊,配置文件等。
軟件包的命名規(guī)則:
sl _ 3.03 - 16 _ i386 . deb
軟件名 版本號 修訂版本 架構(gòu) 包的后綴
i386 :32位操作系統(tǒng)
amd64:64位操作系統(tǒng)
離線安裝命令dpkg
在安裝軟件的時(shí)候,不會(huì)檢查軟件的依賴關(guān)系
安裝軟件:
sudo dpkg -i 軟件包名
例:
sudo dpkg -i sl_3.03-16_i386.deb
查看安裝軟件的版本號
sudo dpkg -l 軟件名
查看軟件對應(yīng)的各種信息安裝的位置
sudo dpkg -L 軟件名
軟件的卸載(配置信息會(huì)保留)
sudo dpkg -r 軟件名
完全卸載
sudo dpkg -P 軟件名
在線安裝apt-get
先檢查軟件的依賴,如果發(fā)現(xiàn)軟件有依賴的其他軟件,一并安裝到自己的系統(tǒng)中
1.更新本地的源
sudo apt-get update
2.安裝軟件(/var/cache/apt/archives)
sudo apt-get install sl //安裝小火車應(yīng)用程序
sudo apt-get install oneko //安裝一個(gè)小貓
sudo apt-get install bastet //俄羅斯方塊
sudo apt-get install frozen-bubble //泡泡龍
sudo apt-get install kolourpaint4 //畫圖板
sudo apt-get install xawtv //打開攝像頭的軟件
sudo apt-get install -f sl //強(qiáng)制安裝
3.卸載軟件
sudo apt-get remove 軟件名
4.獲取軟件的源碼
sudo apt-get source 軟件名
(獲取軟件對應(yīng)源碼)
例:
sudo apt-get source sl //下載sl的源碼
tar -xvf sl_3.03.orig.tar.gz //解壓
cd sl-3.03.orig //進(jìn)入解壓后的目錄
vi sl.c //這個(gè)就是sl的源碼
5.只下載不安裝(下載到當(dāng)前路徑下)
sudo apt-get download 軟件名
6.清除下載的軟件包
sudo apt-get clean
倉庫1 倉庫2 … 倉庫n
|------------------------|
|
服務(wù)器1 服務(wù)器2 … 服務(wù)器n
由于用戶所在的位置不同,訪問服務(wù)器的時(shí)候,速率也不同。
選擇這個(gè)訪問最快的服務(wù)器自己使用。
比如選擇的服務(wù)器是163服務(wù)器。
選擇163服務(wù)器的方法如下:
1.點(diǎn)擊->search->Update Manager->settings->
輸入密碼1->ubuntu software->download from->
->http://mirrors.163.com/ubuntu
可以將上述的服務(wù)器1中的倉庫的地址同步到ubuntu的本機(jī)上,
在本機(jī)上/etc/apt/source.list //源路徑-如163服務(wù)器
每一個(gè)倉庫中又有很多的軟件包,在本機(jī)的這個(gè)目錄
/var/lib/apt/lists/下記錄的就是軟件的鏈接位置。 //各個(gè)軟件的地址
錯(cuò)誤1:
如果提示錯(cuò)誤在錯(cuò)誤信息中看到/var/lib/apt/lists/內(nèi)容
解決辦法:
cd /var/lib/apt/lists/
sudo rm * -rf
錯(cuò)誤2:
ubuntu沒有聯(lián)網(wǎng)?
聯(lián)網(wǎng)的方法如下:
1.在vmware中找到“編輯”選項(xiàng)->虛擬網(wǎng)絡(luò)編輯器->
更改設(shè)置->如果點(diǎn)進(jìn)來沒有看到vnet0 vnet1 vnet8
->點(diǎn)擊還原默認(rèn)配置(需要在關(guān)機(jī)情況下進(jìn)行)
2.在上述還原默認(rèn)配置之后,選擇vnet0,橋接模式
在橋接模式先選擇
1.自動(dòng)
2.pcie :有線網(wǎng)卡
3.wireless:無線網(wǎng)卡選擇完之后點(diǎn)擊確認(rèn)
3.虛擬機(jī)->設(shè)置->硬件->網(wǎng)絡(luò)適配器->選擇“橋接模式”
4.做完上述操作之后“開機(jī)”
5.在開機(jī)之后,在ubuntu窗口的右上角能看到上下箭頭或者wifi圖標(biāo)的選項(xiàng),點(diǎn)擊->edit connections–>將看到的默認(rèn)選項(xiàng)刪除—>點(diǎn)擊add添加一個(gè)聯(lián)網(wǎng)的選項(xiàng)—>然后關(guān)閉即可。
6.測試是否能聯(lián)通
ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7: icmp_req=1 ttl=53 time=5.27 ms
在ubuntu中閱讀代碼的工具ctags
1.安裝ctags工具
sudo apt-get install exuberant-ctags
2.創(chuàng)建索引
ctags -R ==>會(huì)生成一個(gè)tags的索引文件
執(zhí)行make tags ==> 在內(nèi)核中創(chuàng)建索引文件
3.查找
3.1在終端上查找
vi -t 想查找的對象
若vi -t 無法使用,可以在查看的內(nèi)核源碼處,執(zhí)行make tags
3.2在文件內(nèi)查找
ctrl+] 跳轉(zhuǎn)到實(shí)現(xiàn)的位置
ctrl+t 返回
壓縮和打包
1. 壓縮:對象是文件
將文件可以壓縮成如下格式的文件
.gz ---->gzip
.bz2 ---->bzip2
.xz ---->xz
上述三者的壓縮率從上到下逐漸遞增
上述三者的壓縮速率從上到下逐漸遞減
例:
gzip COPYING //將COPYING壓縮成COPYING.gz
//壓縮完之后源文件就不存在了
gunzip COPYING.gz //將.gz格式的壓縮文件解壓
bzip2 COPYING //將COPYING壓縮成COPYING.bz2
//壓縮完之后源文件就不存在了
bunzip2 COPYING.bz2 //將.bz2格式的壓縮文件解壓
xz COPYING //將COPYING壓縮成COPYING.xz
//壓縮完之后源文件就不存在了
unxz COPYING.xz //將.xz格式的壓縮文件解壓
2.打包(歸檔):對象是目錄
tar 參數(shù) 對象
參數(shù):
- -c :打包
- -x :解包
- -v :顯示打包或者拆包的過程信息的
- -f :f可以理解為file,f后必須跟文件名
- -z :壓縮成gzip格式
- -j :要壓縮成bzip2格式
- -J :要壓縮成xz格式
打包的命令如下:
tar -cvf 目錄名.tar 目錄名/
注意:c和v位置可以互換,但是f一定是在最后的位置的
拆包的命令如下:
tar -xvf 目錄名.tar
就會(huì)生成以"目錄名"命名的目錄
例:有一個(gè)名為"work"的目錄名
tar -czvf work.tar.gz work/ 打包并壓縮
tar -xzvf work.tar.gz
tar -cjvf work.tar.bz2 work/
tar -xjvf work.tar.bz2
tar -cJvf work.tar.xz work/
tar -xJvf work.tar.xz
通用的解壓命令
tar -xvf 名字.tar.bz2
目錄在打包的時(shí)候,可以更換打包名字,但是解壓出來名字還是原來的名字
文件操作的命令
文件的查看
vim 文件名(可以查看文件,也可以來編輯文件)
cat命令
cat -n 文件名
將文件的內(nèi)容和行號顯示到終端上
cat /etc/issue
用來查看ubuntu的版本號
head命令
head 文件名
默認(rèn)顯示文件中的前10行
head -20 文件名
顯示文件的前20行的內(nèi)容
head -3 文件名
顯示文件的前3行的內(nèi)容
tail命令 ->tail -f +文件名 實(shí)時(shí)顯示文件更新
tail 文件名
顯示文件的后10行
tail -20 文件名
顯示文件的后20行
顯示文件的13-16行
head -16 文件名 | tail -3
|(管道符):這個(gè)符號的功能是將前面的結(jié)果,作為下一個(gè)命令的輸入。
例:
請將用戶信息顯示到終端上
用戶信息存放在 /etc/passwd里面在第40行的位置
c: x:1000:1000:c,:/home/c:/bin/bash
c: \表示用戶名
x: \表示有密碼 -> 密碼存放在 /etc/shadow 里面
1000:\ 表示用戶的序列號
1000: \ 表示組的序列號
c \ 表示用戶信息的描述字段
/home/c: \ 用戶的主目錄
/bin/bash \命令行解析器
使用:head -40 /etc/passwd | tail -1
more命令
more 文件名 //按照文件的本分比顯示
按下回車往下顯示
less命令
less 文件名
上鍵 向上顯示
下鍵 向下顯示
退出的時(shí)候使用q鍵
查看二進(jìn)制文件
od -c 二進(jìn)制文件名(例:a.out)
文件中內(nèi)容搜索的命令 grep
grep “main”(要搜索的內(nèi)容) * 參數(shù)
參數(shù):
-n: 顯示搜索到的行號
-R: 遞歸搜索
-i: 忽略大小寫
-w: 精確搜索,只能知道m(xù)ain 對應(yīng)的內(nèi)容,main有前綴或后綴都檢測不到
搜索以main開頭的行:“^main”
搜索以main結(jié)尾的行:“main
”
"
m
a
i
n
” "^main
”"main":只有有main這一個(gè)單詞
grep “main” * -nR //經(jīng)常用的一種寫法
例:
文件搜索命令 find
find 路徑 -name 文件的名字
例:
find ./ -name test.c
搜索當(dāng)前目錄及子目錄的所有的以test.c命名的文件
find …/…/ -name test.c
搜索上上級目錄及子目錄下的所有的以test.c命名的文件
find -name 文件名 (常用的寫法)
搜索當(dāng)前目錄及子目錄的所有的以test.c命名的文件
注意:
如果find命令在當(dāng)期目錄下所有搜索文件的時(shí)候,
不能模糊搜索(不能使用通配符號),必須精確搜索。
否則出現(xiàn)如下錯(cuò)誤:find -name *.c
find: paths must precede expression: test.c
find -name * .c -exec grep -l “main” {} ;
// find -name *.c 搜索當(dāng)前目錄及子目錄中的
所有的.c結(jié)尾的文件
//-exec grep:執(zhí)行完find之后去執(zhí)行g(shù)rep命令
//-l :顯示文件列表
//“main” :被搜索的字符串
//{} :它代表的是就是find -name *.c搜索
到的結(jié)果文件。
// ; :-exec執(zhí)行的時(shí)候遇到;才會(huì)停止,
:但是由于;是一個(gè)特殊字符,必須使用
:轉(zhuǎn)譯才可以。
文件中內(nèi)容截取cut(以行為單位處理)
cut(處理的時(shí)候是以行為單位)
-d :分割符號
-f :域
例:
test.txt
北京市:海淀區(qū):育新花園:17號樓:304室
cut -d : -f 1 test.txt==>北京市
cut -d : -f 2,4 test.txt==>海淀區(qū):17號樓
cut -d : -f 1,3-5 test.txt==>北京市:育新花園:17號樓:304室
北京市"海淀區(qū)"育新花園"17號樓"304室
cut -d " -f 2 test.txt ==>海淀區(qū)
例:
1.請將用戶信息中的/etc/passwd
在終端上顯示 用戶名:uid:pid
結(jié)果:linux:1000:1000
命令:head -40 /etc/passwd | tail -1 | cut -d : -f 1,3-4
2.請將用戶信息文件中,當(dāng)前用戶的行號顯示出來
結(jié)果:40
命令:cat /etc/passwd | cut -d : -f 1 | grep “c” -nw | cut -d: -f 1
通配符
“*” 可以匹配任意長度的字符
例:
1.c 2.c 3.c 123123123.c sdfsfsdfsd.txt
ls * .c
顯示當(dāng)前目錄下的所有的.c結(jié)尾的文件
? 只去匹配一個(gè)字符
例:
aa1.c aa2.c aaa.c aa12.c
ls aa?.c
結(jié)果是:aa1.c aa2.c aaa.c
[字符1字符2…字符n]
通配[]內(nèi)部的任意的一個(gè)字符
例:
aa1.c aa2.c aaa.c aab.c
ls aa[1ab].c
結(jié)果:aa1.c aaa.c aab.c
[起始字符-結(jié)束字符]
通配起始字符到結(jié)束字符中的任意一個(gè)字符
例1:
aa1.c aa2.c aaa.c aab.c
執(zhí)行:ls aa[1-9].c
結(jié)果:aa1.c aa2.c
執(zhí)行:ls aa[a-z].c
結(jié)果:aaa.c aab.c
例2:
aaa.c aab.c aaA.c aaB.c
執(zhí)行:ls aa[A-C].c
結(jié)果:aaA.c aab.c aaB.c
想得到的結(jié)果:aaA.c aaB.c
出現(xiàn)上述的原因是系統(tǒng)的語系問題,本地
的語系中字母的排序是
aAbBcC…zZ
解決辦法:export LC_ALL=C
LC_ALL是系統(tǒng)中保存本地語系的一個(gè)變量
=C作用清除本地語系。
上述命令只在當(dāng)前終端生效,換一個(gè)終端,
或者重啟ubuntu就不生效了。
清除后的語系的排序:
abcd…z ABCD…Z
執(zhí)行上述操作之后就可以得到正確的結(jié)果了
ls aa[A-C].c
結(jié)果:aaA.c aaB.c
[^ 字符1字符2…字符n]
通配除字符1 字符2 … 字符n之外的所有字符
例:
aa1.c aa2.c aaA.c aaB.c aaY.c aaa.c aab.c aay.c
執(zhí)行:ls aa[^1y].c
結(jié)果:aa2.c aaA.c aaB.c aaY.c aaa.c aab.c
通配符 | 含義 |
---|---|
[:alnum:] | 代表英文大小寫字母及數(shù)字 |
[:alpha:] | 代表英文大小寫字母 |
[:blank:] | 代表空格和tab鍵 |
[:cntrl:] | 鍵盤上的控制按鍵,如CR,LF,TAB,DEL |
[:digit:] | 代表數(shù)字 |
[:graph:] | 代表空格符以外的其他 |
[:lower:] | 小寫字母 |
[:print:] | 可以被打印出來的任何字符 |
[:upper:] | 代表大寫字母 |
[:space:] | 任何會(huì)產(chǎn)生空白的字符如空格,tab,CR等 |
[:xdigit:] | 代表16進(jìn)位的數(shù)字類型 |
文件權(quán)限的修改
d r-x r-x r-x 2 c c 4096 6月 18 17:09 dem01
r-x r-x r-x:權(quán)限
2:硬鏈接數(shù)
c : 用戶
c : 組
修改用戶的權(quán)限chmod
r-x r-x r-x
第一個(gè)表示:用戶的權(quán)限 用 u 表示
第二個(gè)表示:組的權(quán)限 用g表示
第三個(gè)表示:其他用戶的權(quán)限 用o表示
用+ :給權(quán)限
用- :去除權(quán)限
chmod u+w dem01 //給用戶添加寫的權(quán)限
chmod g-r dem01 //清除組讀的權(quán)限
chmod uo+x aaA.c //將用戶和其他人的可執(zhí)行的權(quán)限添加上
chmod ugo+w aaA.c //將所有的寫的權(quán)限添加上去
chmod a+w aaA.c //將所有的寫的權(quán)限添加上去
a相當(dāng)于ugo
修改文件所屬的用戶chown
chown 新用戶名 文件
例:
將day2.txt文件所屬的用戶修改為root
sudo chown root day2.txt
將day2.txt文件所屬的用戶和組修改為root
sudo chown root:root day2.txt
將day2.txt文件所屬的組修改為linux
sudo chown :linux day2.txt
修改文件所屬組的命令chgrp
chgrp 新的組名 文件
例:
將day2.txt文件所屬的組修改為root
sudo chgrp root day2.txt
鏈接
軟鏈接 ln -s
軟鏈接類似于windows的快捷方式
ln -s 被鏈接的文件 創(chuàng)建的鏈接文件
例:ln -s ~/exercise/dem01/num.c /home/c/1
軟鏈接 可以鏈接文件或目錄,兩個(gè)都需要是絕對路徑
建立軟鏈接后,把軟鏈接刪除對原文件沒影響
ln -f 強(qiáng)制創(chuàng)建鏈接文件,如果目標(biāo)存在,那么先刪除掉目標(biāo)文件,然后再建立鏈接文件。
軟鏈接特點(diǎn):
①可以連接到目錄
②可以跨文件系統(tǒng)
③刪除源文件后,軟鏈接文件也就打不開了
④符號連接文件通過->來指示具體的鏈接文件
⑤軟鏈接需要?jiǎng)?chuàng)建給出絕對路徑
拷貝 應(yīng)使用 cp -d 命令,保持原文件類型不變
硬鏈接 ln
相當(dāng)于是文件的別名
ln 被鏈接的文件 創(chuàng)建的鏈接文件
例:ln days my_days
建立硬鏈接后,兩個(gè)文件是獨(dú)立的文件,但是更改其中一個(gè)里面的內(nèi)容后,另一個(gè)里面的內(nèi)容也會(huì)更改
①具有相同inode的多個(gè)文件互為硬鏈接文件,創(chuàng)建硬鏈接相當(dāng)于文件實(shí)體多了入口
②對于硬鏈接文件,只有刪除了源文件以及對應(yīng)的所有硬鏈接文件,文件實(shí)體才會(huì)被刪除
③根據(jù)硬鏈接文件的特點(diǎn),我們可以通過給文件創(chuàng)建硬鏈接的方式來防止文件誤刪除
④不論修改源文件還是鏈接文件,另一個(gè)文件的數(shù)據(jù)都會(huì)被改變
⑤硬鏈接不能跨文件系統(tǒng) 因?yàn)橛叉溄邮歉鶕?jù)inode號識別的
⑥硬鏈接不能連接目錄
由于以上這些限制,硬鏈接不常用
用戶管理命令
vi /etc/hostname ==> 修改主機(jī)名
vi /etc/hosts ==> 修改主機(jī)名
在172. … 里面把名字修改為主機(jī)名
在終端輸入 hostname 可以查看
/etc/passwd =>用戶信息的文件
/etc/group =>組信息的文件
/etc/shadow =>密碼的文件
/etc/skel =>系統(tǒng)配置文件的模板目錄
添加用戶 adduser (添加組addgroup)
例:添加farsight 用戶
sudo adduser farsight //添加fasight用戶
添加時(shí)候顯示如下信息:
Adding user farsight' ... Adding new group
farsight’ (1001) … =>組名及id號
Adding new user farsight' (1001) with group
farsight’ …=>用戶名及id號
Creating home directory /home/farsight' ... Copying files from
/etc/skel’ … =>/etc/skel模板目錄,里面是系統(tǒng)配置文件
Enter new UNIX password: =>密碼2
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for farsight
Enter the new value, or press ENTER for the default
Full Name []: =>名字
Room Number []: =>地址
Work Phone []: =>電話
Home Phone []:
Other []:
Is the information correct? [Y/n] Y
新添加用戶沒有sudo權(quán)限解決方法
執(zhí)行sudo 出現(xiàn)如下錯(cuò)誤:
farsight:is not in the sudoers file.This incident will be reported
解決辦法:
首先切換到root 用戶
su root
cd /etc/
chmod u+w sudoers //給sudoers這個(gè)文件的用戶的寫的權(quán)限添加上去
vi sudoers
找到 root ALL=(ALL:ALL) ALL
添加 farsight ALL=(ALL:ALL) ALL //表示給farsight用戶sudo的權(quán)限
然后執(zhí)行 chmod u-w sudoers //把添加的權(quán)限去掉
重啟系統(tǒng)就生效了(16.04不用重啟)
關(guān)機(jī)或重啟命令
sudo shutdown -h +50 //50分鐘后關(guān)機(jī)
sudo shutdown -h 10:30 //10:30關(guān)機(jī)
sudo shutdown -h now //立即關(guān)機(jī)
sudo poweroff //立即關(guān)機(jī)
sudo shutdown -r +50 //50分鐘后重啟
sudo shutdown -r 10:30 //10:30重啟
sudo shutdown -r now //立即重啟
sudo reboot //立即重啟
用戶切換命令 su 用戶名 (輸入當(dāng)前用戶的密碼即可)
退出用戶 exit
修改密碼的命令 sudo passwd 用戶名
用戶信息修改命令usermod
切換用戶,當(dāng)前用戶沒有登錄 //使用該命令,用戶應(yīng)處于沒有登錄狀態(tài)
sudo usermod -aG linux farsight // 將farsight用戶追加到linux組中
sudo usermod -c “hellohellohello” farsight //用來修改farsight用戶/etc/passwd中描述字段信息,
//這里的,描述字段就是登陸時(shí)候顯示的名字
sudo usermod -d /home/hello farsight // 用來修改用戶的主目錄,將farsight的主目錄修改為/home/hello
sudo usermod -l hello farsight // 將farsight的用戶名修改為hello
sudo usermod -g linux hello //將hello用戶所屬的組修改為linux(組名)
問題:修改完用戶信息后,新用戶通過圖形界面登錄不進(jìn)去?
可以通過終端登錄進(jìn)入?
錯(cuò)誤的原因是執(zhí)行了如下命令:
sudo usermod -d /home/hello farsight
解決辦法:
(fn)ctrl + alt +F1 ===>進(jìn)入虛擬終端
1.將farsight目錄下的內(nèi)容拷貝到hello目錄下
(注意這里需要將文件和hello目錄的用戶和組從root
用戶修改當(dāng)前用戶和組即可)
2.sudo usermod -d /home/farsight hello
(fn)ctrl + alt +F7 ===>退出虛擬終端
查看用戶信息的命令 id 用戶名
刪除用戶deluser (刪除組delgroup)
刪除用戶需要把用戶關(guān)閉,在另一個(gè)用戶進(jìn)行
sudo deluser hello(要?jiǎng)h除的用戶) //刪除用戶,并將用戶的主目錄刪除掉
磁盤操作相關(guān)命令
查看ubuntu系統(tǒng)的磁盤 sudo fdisk -l
查看磁盤使用量信息的命令 sudo df -h
/media/c/FAT32是U盤的目錄
查看磁盤掛載相關(guān)的命令 sudo mount
一般為設(shè)備名(/dev/sdb1)目錄名
對硬盤操作相關(guān)的命令
sudo fdisk /dev/sdb
Command (m for help): m
Command action
d 刪除分區(qū)
l 列舉分區(qū)
m 打印幫助菜單
n 添加新的分區(qū)
p 打印磁盤菜單
q 不保存退出
w 保存退出
指定磁盤類型的命令
sudo mkfs.ext4 /dev/sdb2 ===>ext4 日志文件系統(tǒng) ubuntu
sudo mkfs.ntfs /dev/sdb2 ===>ntfs 單個(gè)文件可以超過4G
環(huán)境變量問題
保存系統(tǒng)啟動(dòng)相關(guān),或者系統(tǒng)配置相關(guān)的變量。
在系統(tǒng)中可以通過env命令打印系統(tǒng)當(dāng)前的環(huán)境變量
HOME=/home/linux #linux用戶家目錄
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
添加只對當(dāng)前終端生效的環(huán)境變量
export PATH=${PATH}:/home/c //使用絕對路徑 并且只對當(dāng)前層有效,進(jìn)入下一層或上一層失效
添加只對當(dāng)前用戶生效的環(huán)境變量
.bashrc (在用戶家目錄下)
vi .bashrc
在最后添加
export PATH=${PATH}:/home/c
重啟ubuntu生效
添加對所有用戶生效的環(huán)境變量
sudo vi /etc/environment
在最后添加:
PATH=“/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/c/”
網(wǎng)絡(luò)相關(guān)命令
ip
主機(jī)在網(wǎng)絡(luò)中的一個(gè)編號,這個(gè)編號就是ip地址
ip組成
網(wǎng)絡(luò)號+主機(jī)號 組成
ip表示方式
點(diǎn)分十進(jìn)制
ip的種類
ipv4 (4字節(jié),32bit) ipv6(16字節(jié),128bit)
.ipv4的網(wǎng)段劃分
等級 | 網(wǎng)絡(luò)號 | 主機(jī)號 | 最高位 | 范圍 | 使用單位 |
---|---|---|---|---|---|
A | 1字節(jié) | 3字節(jié) | 0 | [0-127] | 政府、大公司、學(xué)校 |
B | 2字節(jié) | 2字節(jié) | 10 | [128-191] | 中等規(guī)模公司 |
C | 3字節(jié) | 1字節(jié) | 110 | [192-233] | 個(gè)人 |
D | 1110 | [224-239] | 組播 | ||
E | 11110 | [240-255] | 未使用或(實(shí)驗(yàn)室) |
A : 0.0.0.0 - 127.255.255.255 //A網(wǎng)段地址范圍
B: 128.0.0.0-191.255.255.255 //B網(wǎng)段地址范圍
C:192.0.0.0-223.255.255.255 //C網(wǎng)段地址范圍
D:224.0.0.0-239.255.255.255 //D網(wǎng)段地址范圍
E:240.0.0.0-255.255.255.255 //E網(wǎng)段地址范圍
子網(wǎng)掩碼
例: 子網(wǎng)掩碼:獲取網(wǎng)絡(luò)編號 192.168.1.160 & 255.255.255.0
得 : 192.168.1.0
網(wǎng)關(guān)
和外網(wǎng)通訊的ip地址,叫網(wǎng)關(guān),一般咱們認(rèn)為交換機(jī)的ip地址
DNS 域名解析器
www.baidu.com -->182.61.200.7
查看網(wǎng)絡(luò)的命令 ifconfig
圖像界面設(shè)置靜態(tài)IP
address : 192.168.1.250
netmask : 255.255.255.0
gateway : 192.168.1.1
DNS : 8.8.8.8
重啟網(wǎng)絡(luò)管理服務(wù)
sudo service network-manager restart
測試:
ping www.baidu.com
PING www.a.shifen.com (182.61.200.7) 56(84) bytes of data.
64 bytes from 182.61.200.7: icmp_req=1 ttl=53 time=4.56 ms
使用命令配置網(wǎng)絡(luò)
sudo vi /etc/network/interfaces
auto ens33
iface ens33 inet static
address 192.168.0.106 //ip 根據(jù)實(shí)際情況設(shè)定
netmask 255.255.255.0
gateway 192.168.0.1 //根據(jù)實(shí)際情況設(shè)定
broadcast 192.168.0.255 //根據(jù)實(shí)際情況設(shè)定
dns-nameservers 8.8.8.8
重啟:
sudo /etc/init.d/networking restart 或 sudo systemctl restart NetworkManager.service
注意,上述重啟之后需要修改配置文件,聯(lián)網(wǎng)圖標(biāo)才能正常顯示
在 /etc/NetworkManager/NetworkManager.conf. 中修改
ifupdown:managed=false ==>true //把false 修改為true
vim使用
先安裝vim編輯器:
sudo apt-get install vim-gtk
修改自動(dòng)補(bǔ)全的文件
linux@ubuntu:~/.vim/snippets$ vi c.snippets 路徑
70 snippet main
71 #include <stdio.h>
72
73 int main(int argc, const char *argv[])
74 {
75 ±-- 2 lines: ${1}---------------------------------------------------------------------
77 }
~
vim分為三種工作模式
1.命令行工作模式
打開一個(gè)新的文件默認(rèn)在命令行模式,或者按下鍵盤上的Esc鍵,也能回到命令行模式
復(fù)制 y
yy 復(fù)制光標(biāo)所在的一行
3yy 復(fù)制光標(biāo)所在的向下三行
nyy 復(fù)制光標(biāo)所在的向下n行
使用鼠標(biāo)選中想要拷貝的行,按下鍵盤的y
按下鍵盤的shift鍵,鼠標(biāo)選中想要拷貝的行,
松開shift鍵,右鍵拷貝即可,然后在windows中粘貼。
如果是16.04之后的版本中,shift不松開即可。
剪切 d
dd 剪切光標(biāo)所在的一行
3dd 剪切光標(biāo)所在的向下三行
ndd 剪切光標(biāo)所在的向下n行
使用鼠標(biāo)選中想要剪切的行,按下鍵盤的d
dG 剪切光標(biāo)所在到尾行的所有內(nèi)容
dgg 剪切光標(biāo)所在到首行的所有內(nèi)容
gg直接跳到首行
G直接跳到尾行
粘貼 p
p 將緩沖區(qū)的內(nèi)容粘貼,在光標(biāo)的下一行粘貼
撤銷 u
反向撤銷 ctrl + r
代碼對齊
gg=G
或者
鼠標(biāo)選中想要 對齊的行,然后按下鍵盤的“=”
搜索及高亮顯示
/^abc :高亮顯示abc開頭的行
/abc$ :高亮顯示abc結(jié)尾的行
/^abc$ :高亮顯示abc開頭并結(jié)尾的行
插入模式
從命令行模式進(jìn)入到插入模式
i :在光標(biāo)前進(jìn)入插入模式
I :在光標(biāo)的行首進(jìn)入插入模式
a :在光標(biāo)后進(jìn)入插入模式
A :在光標(biāo)的行尾進(jìn)入插入模式
o :在光標(biāo)的行的下面新起一行進(jìn)入插入模式
O :在光標(biāo)的行的上面新起一行進(jìn)入插入模式
底行模式
從命令行模式進(jìn)入到底行模式shift + :
保存/退出文件
:w 保存
:q 退出
:q! 不保存退出
:wq 或x 保存退出
:wq! 強(qiáng)制保存退出
:wa 保存所有的文件
:qa! 不保存退出所有文件
:wqa 保存退出所有文件
水平打開多個(gè)文件 vsp 文件名
垂直打開多個(gè)文件 sp 文件名
拷貝、剪切
:7,8y 拷貝7-8行,通過命令行的p進(jìn)行粘貼
:4,$y 拷貝4-尾行的內(nèi)容
:1,7y 拷貝文件開頭到第七行的內(nèi)容
:7,8d 剪切7-8行,通過命令行的p進(jìn)行粘貼
:4,$d 剪切4-尾行的內(nèi)容
:1,7d 剪切文件開頭到第七行的內(nèi)容
:n 跳轉(zhuǎn)到第n行
vi test.c +100 打開文件的時(shí)候直接跳轉(zhuǎn)到100行
:set nonu 取消行號
:set nu 顯示行號
.:nohl 取消高亮顯示
替換
**:%s/舊字符串/新字符串/g**
例:
**:%s/abc/www/g**
//表示將文檔中的所有的abc替換為www
**:%s/abc/www/**
//表示將文檔中每行首次出現(xiàn)的abc替換為www
**:3,7s/abc/www/g**
//表示將3-7行所有的abc替換為www
**:3,7s/abc/www/**
//表示將3-7行首次出現(xiàn)的abc替換為www
**:4,$s/abc/www/g**
//表示將4到尾行所有的abc替換為www
**:4,$s/abc/www/**
//表示將4到尾行首次出現(xiàn)的abc替換為www
三 、shell編程
shell定義
(1)sh :(全稱 Bourne Shell)是UNIX最初使用的 shell,
而且在每種 UNIX 上都可以使用。Bourne Shell 在 shell
編程方面相當(dāng)優(yōu)秀,但在處理與用戶的交互方面做得不如
其他幾種 shell。
(2)csh :是一種比 Bourne Shell更適合的變種 Shell,它的語法與 C 語言很相似
(3)ksh :集合了 C Shell 和 Bourne Shell 的優(yōu)點(diǎn)并且和 Bourne Shell 完全兼容。
(4)bash :LinuxOS 默認(rèn)的,它是 Bourne Shell 的擴(kuò)展。
與 Bourne Shell 完全兼容,并且在 Bourne Shell 的基
礎(chǔ)上增加了很多特性??梢蕴峁┟钛a(bǔ)全,命令編輯和命
令歷史等功能。它還包含了很多 C Shell 和 Korn Shell
中的優(yōu)點(diǎn),有靈活和強(qiáng)大的編輯接口,同時(shí)又很友好的用戶界面
什么是shell腳本
它本身是一個(gè)以sh結(jié)尾的文件。在這個(gè)文件中就是命令的集合以及一些復(fù)雜的邏輯語句。
#!/bin/bash
作用:指定解析這個(gè)腳本文件的解析器是bash
執(zhí)行shell腳本
./腳本名 (chmod 0777 腳本名.sh)
bash 腳本名
source 腳本名
三者的區(qū)別
-
./執(zhí)行腳本的時(shí)候需要權(quán)限
bash/source執(zhí)行腳本的時(shí)候不需要權(quán)限 -
./和bash在執(zhí)行腳本的時(shí)候,系統(tǒng)會(huì)自動(dòng)新開一個(gè)子終端,子終端我們看不到,在子終端執(zhí)行完之后,將執(zhí)行的結(jié)果返回給當(dāng)前終端
source 解析腳本的時(shí)候是在當(dāng)前終端解析的
shell中變量
在shell中變量不需要定義,也沒有數(shù)據(jù)類型,直接使用即可
shell中的變量的變量名和c語言類似
1.不能和shell中的關(guān)鍵字重復(fù) test if while echo cat
2.變量名一般寫成大寫的
3.變量名命名格式數(shù)字,字母,下劃線,不能以數(shù)字作為開頭
變量引用
$ 變量名 或者 ${變量名}
$() 錯(cuò)誤的用法
變量賦值
變量再被賦值的時(shí)候,都是字符串,就沒有整形,字符型,字符串類型,浮點(diǎn)類型之分
例:
VAR1= helloworld (一句話結(jié)束不需要向c一樣加;)
VAR2='hello world
V
A
R
1
′
V
A
R
3
=
"
h
e
l
l
o
w
o
r
l
d
VAR1' VAR3="hello world
VAR1′VAR3="helloworldVAR1"
注意:
1.在賦值的時(shí)候=前后不允許有空格
2.如果在賦值的時(shí)候沒有’'或"",賦值的字符串是不允許有空格的
3.’ '(單引號)在賦值的時(shí)候,可以有空格,但是不能夠引用變量
4.“”(雙引號)在賦值的時(shí)候,可以有空格,也能夠引用變量,可以識別轉(zhuǎn)譯字符
shell中的注釋
“#”單行注釋
:<<EOF
被注釋掉的多行
EOF
:<<!
被注釋掉的多行
!
例:
#!/bin/bash
:<<EOF
這是注釋部分
EOF
:<<!
這也是注釋部分
!
# 這是單行注釋部分
TMP=www.hqyj.com
VAR1=helloworld
VAR2='hello world\n$TMP'
VAR3="hello world\n$TMP"
echo -n ${VAR1}
echo $VAR2
echo -e $VAR3
echo ${VAR1}
清除變量 unset
unset 變量名 #(注意不能再變量前加$)
位置變量
參數(shù) | 意義 |
---|---|
$0 | 顯示腳本文件名 |
$1,$2,…$9 | 分別包含第一個(gè)到第九個(gè)命令行參數(shù),后面還可以加$10,$11,但是寫的時(shí)候,要用大括號{}擴(kuò)起來 |
$# | 包含命令行參數(shù)的個(gè)數(shù),這個(gè)值不包含文件名這個(gè)成員 |
$@ | 包含所有命令行參數(shù):“$1,$2,…$9”,不包含文件名 |
$? | 1.程序上一步執(zhí)行的結(jié)果,如果是0,表示執(zhí)行成功了 如果是1,表示執(zhí)行失敗了。2.可以用來獲取shell中函數(shù)的返回值 |
$* | 包含所有命令行參數(shù):“$1,$2,…$9” ,不包含文件名 |
$$ | 包含正在執(zhí)行進(jìn)程的ID號 |
例: | |
如果在執(zhí)行腳本的時(shí)候使用的是**./** |
**$0 => ./05var.sh**
如果在執(zhí)行腳本的時(shí)候使用的是bash
$0 => 05var.sh
如果在執(zhí)行腳本的時(shí)候使用的是source
$0 => bash
變量的作用域local
local 變量名
如果變量前不加local,默認(rèn)的就是全局變量,如果添加了local只在{}內(nèi)部有效
只讀變量 readonly
readonly 變量名=“初值”
只讀變量一定要賦初值,否則無意義。
給變量賦值命令(命令->linux操作命令)
VAR1=` ls ` (注意這不是單引號,是~對應(yīng)的符號)
VAR2=$(ls)
注意上面:
或者$()這叫做命令置換
例:
#!/bin/bash
readonly HELLO="fsdddsds" #只讀變量
echo $HELLO
HELLO="123" #HELLO是只讀變量,在賦值會(huì)出錯(cuò)
echo $HELLO
Z=hello
echo $Z #Z的值為hello
unset Z #清除變量Z的值
echo $Z
VAR1=`ls` #使用ls命令
VAR2=$(ls) #使用ls命令
echo $VAR1
echo $VAR2
echo $0 #輸出腳本名
echo $1 #輸出終端輸入的第一個(gè)值
echo $2 #輸出終端輸入的第二個(gè)值
echo $3 #輸出終端輸入的第三個(gè)值
echo "----------------------------------------"
echo $* #輸出命令行參數(shù),不包括腳本名
echo "----------------------------------------"
echo $@ #輸出命令行參數(shù),不包括腳本名
echo "----------------------------------------"
echo $# #輸出命令行參數(shù)個(gè)數(shù),不包括腳本名
字符串相關(guān)操作
1.字符串長度
echo $ {# STRING}
2.字符串拷貝
VAR1=“hello”
VAR2=“world”
VAR1=${VAR2}
3.字符串的追加
VAR1=“hello”
VAR2=“world”
VAR3=“$VAR1 $VAR2”
VAR3=“hello $VAR2”
VAR3=‘hello’’ world’
VAR3=‘hello’" world"
4.字符串中子字符串的提取
STRING=“w w w . h q y j . c o m”
echo ${STRING:4} 輸出 #hqyj.com
#從第四個(gè)字符開始提取,提取到字符串的結(jié)尾
echo ${STRING:4:4} 輸出 #hqyj
#從第四個(gè)字符開始提取,提取4個(gè)字符
STRING=“w w w . h q y j . c o m”
echo ${STRING:0-6} 輸出 #yj.com
#從倒數(shù)第六個(gè)字符開始向后截取,截取到字符串的尾部
echo ${STRING:0-6:2} 輸出 #yj
#從倒數(shù)第六個(gè)字符開始向后截取,截取向后的兩個(gè)字符
STRING=“www.hqyj.com.hqyj.com”
echo ${STRING# yj}* 輸出 #.com.hqyj.com
#獲取yj首次出現(xiàn)的字符后的內(nèi)容(從左向右)
echo ${STRING## yj}* 輸出 #.com
#獲取yj最后一次出現(xiàn)的字符后的內(nèi)容(從左向右)
echo ${STRING%yj }* 輸出 #www.hqyj.com.hq
#獲取yj首次出現(xiàn)的字符前的內(nèi)容(從右向左)
echo ${STRING%%yj }* 輸出 #www.hq
#獲取yj最后一次出現(xiàn)的字符前的內(nèi)容(從右向左)
例:
#!/bin/bash
STRING="www.hqyj.com"
echo ${#STRING}
#獲取字符串的長度
VAR1="hello"
VAR2="world"
VAR3="$VAR1 $VAR2"
VAR4='hello'' world'
echo $VAR3
echo $VAR4
#字符串的追加
#下面的都是字符串的提取方法
STRING="www.hqyj.com"
echo ${STRING:4} #hqyj.com
echo ${STRING:4:4} #hqyj
echo ${STRING:0-6} #yj.com
echo ${STRING:0-6:2} #yj
STRING="www.hqyj.com.hqyj.com"
echo ${STRING#*yj} #.com.hqyj.com
echo ${STRING##*yj} #.com
echo ${STRING%yj*} #www.hqyj.com.hq
echo ${STRING%%yj*} #www.hq
shell中的數(shù)組
shell中的數(shù)組只有一維數(shù)組,shell中的數(shù)組通過括號()代表。
shell中的數(shù)組也是不需要定義的,數(shù)組沒有類型,全部認(rèn)為是
字符串。
例:
arr=(11 22 33 “hello” “tt”)
arr=([0]=11 [2]=123123 [5]=“helloworld”)
數(shù)組成員重新賦值
數(shù)組名[下標(biāo)]=新的值
數(shù)組成員的訪問
${數(shù)組名[數(shù)組的下標(biāo)]}
數(shù)組中所有成員
${數(shù)組名[@]} 或者 ${數(shù)組名[*]}
數(shù)組的成員的個(gè)數(shù)
${#數(shù)組名[@]} 或者 ${#數(shù)組名[*]}
數(shù)組成員的追加
arr=(${arr[@]} “rrr” “ttt”)
arr=(“rrr” “ttt” ${arr[@]})
例:
#!/bin/bash
arr=(
11
22
33
"hello"
"world"
)
#echo ${arr[0]}
#echo ${arr[1]}
#echo ${arr[2]}
#echo ${arr[3]}
#echo ${arr[4]}
echo ${arr[@]} #數(shù)組中成員的遍歷
echo ${#arr[@]} #數(shù)組中成員的個(gè)數(shù)
#arr=(${arr[@]} "rrr" "ttt") #數(shù)組的追加
arr=("rrr" "ttt" ${arr[@]}) #數(shù)組的追加
echo ${arr[@]}
unset arr #清除整個(gè)數(shù)組中的成員
unset arr[0] #清除第0個(gè)成員
arr=(
[0]=123
[2]="hello"
[5]="ttt"
)
arr[1]="456" #對數(shù)組中的成員賦值
#echo "arr[0] = "${arr[0]}
#echo "arr[1] = "${arr[1]}
#echo "arr[2] = "${arr[2]}
echo ${arr[*]} #數(shù)組成員的遍歷
echo ${#arr[*]} #數(shù)組中(被賦值)成員的個(gè)數(shù)
echo ${#arr[1]} #a[1]成員中字符的個(gè)數(shù)
shell中的輸入與輸出
read輸入
read 變量名
#從終端讀取一個(gè)字符串賦值給變量
read 變量名1 變量2
#從終端讀取兩個(gè)字符串賦值給兩個(gè)變量,
#字符串和字符串間使用空格或Tab作為間隔
read -a 數(shù)組名
#輸入一個(gè)數(shù)組,數(shù)組的成員以空格分開
read -n number 變量名
#從終端讀取n個(gè)字符給變量,如果輸入的字符的格式=number,會(huì)自動(dòng)結(jié)束輸入
read -p “描述字段” 變量名
#在讓你輸入字符串給變量前先將描述字段給顯示一下
read -s 變量名
#在輸入的時(shí)候取消回顯
read -t 5 變量名
#在5s內(nèi)如果沒有輸入,read就結(jié)束輸入。
例:
echo -n "請輸入一個(gè)變量"
read VAR1 VAR2
echo $VAR1
echo $VAR2
echo -n "請輸入一個(gè)數(shù)組"
read -a ARR
echo ${ARR[@]}
echo ${#ARR[@]}
echo -n "請輸入一個(gè)字符串"
read -n 5 VAR #字符串輸入到5個(gè)后結(jié)束
echo
echo $VAR
read -n 5 -p "請輸入一個(gè)整數(shù)> " VAR2
echo $VAR2
read -s -t 3 -p "密碼 > " VAR2
echo $VAR2
read -t 10 -p "請輸入一個(gè)有5個(gè)成員的數(shù)組" -a arr #10s內(nèi)沒有輸入,自動(dòng)結(jié)束輸入
echo ${arr[@]}
echo輸出
echo $變量名
#打印變量的內(nèi)容并會(huì)加上換行
echo -n $變量名
#打印變量的內(nèi)容,不會(huì)加上換行
echo -e $變量名
#打印變量的內(nèi)容并會(huì)解析轉(zhuǎn)譯字符 \n
運(yùn)算符
算數(shù)運(yùn)算符
* / % **(冪) = == != + -
++ – && || ! > <
由于shell中沒有指定數(shù)據(jù)的類型,所有的變量都當(dāng)成字符串來處理。
所以要完成兩個(gè)變量的運(yùn)算,需要使用shell中算數(shù)運(yùn)算符、算數(shù)指令
shell中對兩個(gè)變量直接進(jìn)行運(yùn)算,會(huì)被當(dāng)成字符串來處理
(())整數(shù)運(yùn)算
$[] 整數(shù)運(yùn)算
let 整數(shù)運(yùn)算
expr整數(shù)運(yùn)算,字符串相關(guān)操作
上述運(yùn)算方式,指向效率(())—>expr依次遞減的expr可以做字符串相關(guān)的操作,其他的是不行的。
(())整數(shù)運(yùn)算
((表達(dá)式))
((表達(dá)式1,表達(dá)式2,…表達(dá)式n))
如果(())有多個(gè)表達(dá)式,最后一個(gè)表達(dá)式的結(jié)果
就是這個(gè)(())運(yùn)算的結(jié)果
1.(())內(nèi)部使用變量的時(shí)候,變量前可以加
也可以不加
也可以不加
也可以不加符號
2.如果想獲取(())執(zhí)行的結(jié)果,必須在前面加上$(())
3.(())可以做復(fù)雜的運(yùn)算,比如for循環(huán) ,判斷大小
例:
#!/bin/bash
read -p "請輸入兩個(gè)整數(shù) >" VAR1 VAR2 #比如輸入55,12
echo $(($VAR1 + $VAR2)) #輸出67
echo $((VAR1 + VAR2)) #輸出67
echo $(($VAR1 + $VAR2,$VAR1 - $VAR2)) #輸出最后一個(gè)表達(dá)式的結(jié)果為43
#!/bin/bash
read -p "請輸入兩個(gè)整數(shù) >" VAR1 VAR2 #比如輸入55,12
VAR3=$((VAR1++))
echo $VAR1 #56
echo $VAR3 #55
VAR4=$((++VAR1))
echo $VAR1 #57
echo $VAR4 #57
#!/bin/bash
read -p "請輸入兩個(gè)整數(shù) >" VAR1 VAR2 #比如輸入 2 3
VAR3=$((VAR1 * VAR2))
echo $VAR3 #6
VAR4=$((VAR1 ** VAR2))
echo $VAR4 #8
for((i=1;i<=100;i++)){
((sum+=i))
}
echo $sum #5050
RET=$((3,4,5,6))
echo $RET #6 輸出最后一個(gè)數(shù)
a=6
b=5
VAL=$((a<b))
echo $VAL #a<b為假,返回0
$[]整數(shù)運(yùn)算
ret=
[
表達(dá)式
]
r
e
t
=
[表達(dá)式] ret=
[表達(dá)式]ret=[表達(dá)式1,表達(dá)式2,…表達(dá)式n]
如果
[
]
有多個(gè)表達(dá)式,最后一個(gè)表達(dá)式的結(jié)果就是這個(gè)
[]有多個(gè)表達(dá)式,最后一個(gè)表達(dá)式的結(jié)果 就是這個(gè)
[]有多個(gè)表達(dá)式,最后一個(gè)表達(dá)式的結(jié)果就是這個(gè)[]運(yùn)算的結(jié)果
1.$[]在執(zhí)行運(yùn)算的時(shí)候,必須有變量去承接它的結(jié)果
$[a+b] #運(yùn)行錯(cuò)誤
必須按如下寫法:
echo
[
a
+
b
]
r
e
t
=
[a+b] ret=
[a+b]ret=[a+b]
2.在
[
]
內(nèi)部調(diào)用變量的時(shí)候,變量前可以加
[]內(nèi)部調(diào)用變量的時(shí)候,變量前可以加
[]內(nèi)部調(diào)用變量的時(shí)候,變量前可以加也可以不加
?
?
?
?
3.
** **3.
????3.[]不支持復(fù)雜的運(yùn)算,比如for $[] 錯(cuò)誤
例:
#!/bin/bash
a=5
b=6
ret=$[a + b]
echo $ret #11
echo $[$a + $b] #11
c=$[a++]
echo $c #5
echo $a #6
a=5
b=6
var1=$[$a<$b]
echo $var1 #1
expr整數(shù)運(yùn)算
1.expr中運(yùn)算的時(shí)候,變量必須使用 ? ? ? ? 2. e x p r 在運(yùn)算的時(shí)候,運(yùn)算符前后必須加空格 ? ? ? ? 3. e x p r 運(yùn)算的結(jié)果會(huì)自動(dòng)打印到終端上 ? ? ? ? 4. 將 e x p r 運(yùn)算的結(jié)果賦值給某個(gè)變量的時(shí)候要使用命令置換 ‘ ‘ 或者 ** **2.expr在運(yùn)算的時(shí)候,運(yùn)算符前后必須加空格** **3.expr運(yùn)算的結(jié)果會(huì)自動(dòng)打印到終端上** **4.將expr運(yùn)算的結(jié)果賦值給某個(gè)變量的時(shí)候要使用命令置換 ` ` 或者 ????2.expr在運(yùn)算的時(shí)候,運(yùn)算符前后必須加空格????3.expr運(yùn)算的結(jié)果會(huì)自動(dòng)打印到終端上????4.將expr運(yùn)算的結(jié)果賦值給某個(gè)變量的時(shí)候要使用命令置換‘‘或者()
5.expr做自加運(yùn)算不行,可以替換成a=expr $a + 1
6.expr在運(yùn)算*時(shí)候需要加上轉(zhuǎn)譯字符 ,不能運(yùn)算等等**
例:
#!/bin/bash
a=5
b=6
echo `expr $a + $b` #輸出11
expr $a + $b #輸出11
a=`expr $a + 1`
echo $a #輸出6
mul=`expr $a * $b`
echo $mul #輸出36
expr字符串的操作
1.expr match 源字符串 子字符串
在源字符串中查找字符串差,如果源字符串中的
第一個(gè)字符和子字符串不相等結(jié)果為0,如果子字符串
有字符和源字符串中的字符不相等,返回的也是0.
否則返回的就是子字符串的長度。
例:
#!/bin/bash
string="www.hqyj.com"
expr match $string "www." #輸出4
**2.expr substr $string 4 3 **
在string中截取從第四個(gè)字符開始,向后的3個(gè)字符
例:
#!/bin/bash
string="www.hqyj.com"
expr substr $string 4 3 #輸出.hg
3.expr index $string “hj” #5
那h字符在string查找第一次出現(xiàn)的位置,如果
找到了就返回它前面的字符的個(gè)數(shù),字符個(gè)數(shù)包括它本身,然后結(jié)束。
若找不到接著拿j字符在string查找第一次位置
如果找到返回j前面的字符個(gè)數(shù),否則返回0
例:
#!/bin/bash
string="www.hqyj.com"
expr index $string "hj" #輸出5
4.expr length $string
功能獲取string變量字符串的長度
#!/bin/bash
string="www.hqyj.com"
expr length $string #輸出12
let整數(shù)運(yùn)算
let 表達(dá)式1 表達(dá)式2 … 表達(dá)式n
1.let會(huì)運(yùn)算所有的表達(dá)式
2.let中變量可以加
,
也可以不加
,也可以不加
,也可以不加
3.運(yùn)算符的前后不能加空格
例:
#!/bin/bash
a=5
b=6
let sum=$a+$b
echo $sum #11
let sum1=$a+$b sum2=$a+$b
echo $sum1 #11
echo $sum2 #11
let a=$a+1
echo $a #6
let mul=a*b
echo $mul #36
if語句
if 語句后面需要加空格 [ ] 里面的語句需要加空格與[ ]分開
? if …then …fi
語法結(jié)構(gòu):
if [ 表達(dá)式 ] ===>[ ] 用作判斷的和test效果是一樣
then ===>[ ] 替換為if test 表達(dá)式
分支語句
fi
● 如果表達(dá)式為真,則執(zhí)行命令表中的命令;否則退出if 語句,即執(zhí)行fi后面的語句
● if 和 fi 是條件語句的語句括號,必須成對使用
● 命令表中的命令可以是一條,也可以是若干條
如:
if [ 表達(dá)式 ]
then
分支語句
elif [ 表達(dá)式 ]
then
分支語句
else
分支語句
fi
在if語句中判斷數(shù)字的大小
符號 | 判斷 |
---|---|
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
-eq | 等于 |
-ne | 不等于 |
邏輯運(yùn)算符
符號 | 判斷 |
---|---|
-a | && |
-o | || |
! | ! |
例: | |
練習(xí): |
90-100 A
80-89 B
70-79 C
60-69 D
<60 E
#!/bin/bash
read -p "請輸入學(xué)生的成績->" str1
if [ $str1 -ge 100 -o $str1 -le 0 ] # 大于100 或者小于0
then
echo "input error!"
exit 1 #直接返回
fi
if [ $str1 -ge 90 -a $str1 -le 100 ] #大于等于90 并且 小于等于100
then
echo "A"
elif [ $str1 -ge 80 -a $str1 -lt 90 ]
then
echo "B"
elif [ $str1 -ge 70 -a $str1 -lt 80 ]
then
echo "C"
elif [ $str1 -ge 60 -a $str1 -lt 70 ]
then
echo "D"
else
echo "E"
fi
練習(xí):
90-100 A
80-89 B
70-79 C
60-69 D
<60 E
if [ $score -gt 100 -o $score -lt 0 ]
then
echo "input error"
exit 1
fi
if test $score -ge 90 -a $score -le 100
then
echo "A"
elif test $score -ge 80
then
echo "B"
elif test $score -ge 70
then
echo "C"
elif [ $score -ge 60 ]
then
echo "D"
else
echo "E"
fi
1.對字符串的判斷(在if語句中字符串需要加上"")
符號 | 意義 |
---|---|
-z | 判斷字符串是否為空 |
-n | 判斷字符串是否為非空 |
=或者== | 判斷兩個(gè)字符串是否相等 |
!= | 不等于 |
\> | 判斷字符串大小,大于 |
\< | 判斷字符串大小,小于 |
練習(xí):
輸入兩個(gè)字符串,判斷字符串的大小,并輸出
#!/bin/bash
read -p "please input str1 > " str1
read -p "please input str2 > " str2
if [ -z "$str1" -o -z "$str2" ]
then
echo "input string error,please try agian"
exit 1
fi
if [ "$str1" == "$str2" ]
then
echo "str1 = str2"
elif [ "$str1" \> "$str2" ]
then
echo "str1 > str2"
else
echo "str1 < str2"
fi
2.對文件的類型的判斷bsp-lcd
-b 判斷文件是否存在,并且判斷文件是否是塊設(shè)備
-c 判斷文件是否存在,并且判斷文件是否是字符設(shè)備
-d 判斷文件是否存在,并且判斷文件是否是目錄
-f 判斷文件是否存在,并且判斷文件是否是普通文件
-L 判斷文件是否存在,并且判斷文件是否是鏈接文件
-S 判斷文件是否存在,并且判斷文件是否是套接字文件
-p 判斷文件是否存在,并且判斷文件是否是管道文件
-e 判斷文件是否存在
如果文件存在,結(jié)果為真
如果文件存在,結(jié)果為假
(如果是鏈接文件,鏈接斷開了,認(rèn)為文件不存在)
-s 判斷文件是否存在,并且判斷文件是否為空
練習(xí)
請輸入一個(gè)文件的名字,將它的類型輸出
#!/bin/bash
read -p "請輸入1個(gè)文件的名字" filename
if test -b $filename
then
echo "這是一個(gè)塊設(shè)備文件"
elif test -c $filename
then
echo "這是一個(gè)字符設(shè)備文件"
elif test -d $filename
then
echo "這是一個(gè)目錄"
elif test -f $filename
then
echo "這是一個(gè)普通文件"
elif test -L $filename
then
echo "這是一個(gè)鏈接文件"
elif test -S $filename
then
echo "這是一個(gè)套接字文件"
fi
3.文件權(quán)限的判斷
-w 判斷文件是否存在,并判斷是否具備寫的權(quán)限
-r 判斷文件是否存在,并判斷是否具備讀的權(quán)限
-x 判斷文件是否存在,并判斷是否具備可執(zhí)行的權(quán)限
練習(xí)
請輸入一個(gè)文件,判斷這個(gè)文件是否是普通文件,
如果文件是普通文件,判斷文件是否具備寫的權(quán)限,
如果文件具備寫的權(quán)限,將"hello world"追加到文件尾部
#!/bin/bash
read -p "請輸入1個(gè)文件的名字" filename
if test -f $filename #判斷普通文件
then
if test -w $filename #判斷是否具有寫的權(quán)限
then
echo "hello world" >> $filename
echo "追加成功"
else
"文件不具備寫的權(quán)限"
fi
else
if [ ! -e $filename ]
then
echo "文件不存在"
else
echo "輸入的不是一個(gè)普通文件"
fi
fi
./dem1.sh #調(diào)用自己重新執(zhí)行,文件名為dem1.sh
4.判斷文件的時(shí)間戳
-nt 前面文件時(shí)間戳是否比后面文件的時(shí)間戳新
-ot 前面文件時(shí)間戳是否比后面文件的時(shí)間戳舊
5.判斷文件的inode號是否相同
-ef 判斷文件的inode是否相同
case … in 語句
case 變量 in
選項(xiàng)1)
分支1
;;
選項(xiàng)2)
分支2
;;
*)
分支n
;;
esac
練習(xí)1
1.在終端上輸入一個(gè)字符,a-z A-Z打印這是一個(gè)字母
0-9這是一個(gè)數(shù)字, ,;“ ?這是一個(gè)標(biāo)點(diǎn)符號
#!/bin/bash
read -p "輸入一個(gè)字符" str1
case $str1 in
[0-9])
echo "這是一個(gè)數(shù)字"
;;
[a-zA-Z])
echo "這是一個(gè)字母"
;;
, |. | \" | \?) #? 是一個(gè)通配符,需要轉(zhuǎn)義
echo "這是一個(gè)標(biāo)點(diǎn)符號"
;;
*)
echo "非法輸入"
;;
esac
練習(xí)2
輸入軟件的名字[Y/N/Q]?來決定是否下載,用戶的選擇可以是Y y YES Yes yes等都要滿足
#!/bin/bash
read -p "請輸入軟件的名字" name
read -p "是否進(jìn)行下載->(y|n|q)" down
case $down in
Y|y|YES|Yes|yes)
echo "下載軟件"
;;
n|N|no|No)
echo "不下載軟件"
;;
q|Q|Quit|QUIT)
exit 1 #程序退出
;;
esac
while循環(huán)
while 表達(dá)式
do
循環(huán)體
done
? while語句首先測試其后的命令或表達(dá)式的值,如果為真,就執(zhí)行一次循環(huán)體中的命令,然后再測試該命令或表達(dá)式的值,執(zhí)行循環(huán)體,直到該命令或表達(dá)式為假時(shí)退出循環(huán)
? while語句的退出狀態(tài)為命令表中被執(zhí)行的最后一條命令的退出狀態(tài)
寫 成while true 是死循環(huán)
練習(xí)1
時(shí)鐘程序
#!/bin/bash
sec=58
min=02
hour=20
day=24
month=4
year=2020
function years() #函數(shù)
{
if ((year%100==0))
then
if ((year%400==0))
then
echo 1
else
echo 2
fi
elif ((year%4==0))
then
echo 1
else
echo 2
fi
}
while true
do
sleep 1
((sec++))
if [ $sec -ge 60 ]
then
sec=0;
((min++))
elif [ $min -ge 60 ]
then
min=0
((hour++))
elif [ $hour -ge 24 ]
then
hour=0
((day++))
case $month in
1|3|5|7|8|10|12)
if [ $day -ge 32 ]
then
day=1
((month++))
fi
;;
4|6|9|11)
if [ $day -ge 31 ]
then
day=1
((month++))
fi
;;
2)
ret=`years year`
if [ $ret -eq 1 ]
then
if [ $day -ge 30 ]
then
day=1
((month++))
fi
elif [ $ret -eq 2 ]
then
if [ $day -ge 29 ]
then
day=1
((month++))
fi
fi
;;
esac
if [ $month -ge 12 ]
then
month=1
((year++))
fi
fi
printf "%4d-%2d-%2d %02d:%02d:%02d\r" $year $month $day $hour $min $sec
done
練習(xí)2
求1-100的和
#!/bin/bash
i=1
while [ $i -le 100 ]
do
((sum+=i++))
done
echo $sum
until循環(huán)
until 表達(dá)式
do
循環(huán)體
done
until循環(huán)和while循環(huán)的功能類似,只不過until循環(huán)中的表達(dá)式要和while循環(huán)的表達(dá)式結(jié)果相反,此時(shí)until和while的功能就是一樣的了
練習(xí)1
1.實(shí)現(xiàn)一個(gè)累加器(在終端上可以任意多的輸入數(shù)據(jù)它會(huì)將輸入數(shù)的和給求出來)
ctrl + c 相當(dāng)于給程序發(fā)送了一個(gè)殺死進(jìn)程的信號
ctrl + d 相當(dāng)于發(fā)送了一個(gè)EOF,可以讓read結(jié)束
#!/bin/bash
i=1
until [ $i -gt 100 ]
do
((sum+=i++))
done
echo $sum
for循環(huán)
c語言風(fēng)格的for循環(huán)(算術(shù)運(yùn)算)
for ((i=0;i<10;i++))
do
循環(huán)體
done
例:
#!/bin/bash
for ((i=1;i<=100;i++))
do
((sum+=i))
done
echo $sum
shell特有風(fēng)格的for循環(huán)(文件)
for 變量 in 單詞列表
do
循環(huán)體
done
1.單詞列表的成員間是通過空格隔開
2.單詞類別中可以使用命令的結(jié)果,命令需要加上命令置換符號 `` $()
3.如果單詞列表是連續(xù)的成員{start…end}seq 1 100
從1開始到100結(jié)束作為單詞列表seq 1 2 100
從1開始,中間跳過一個(gè)成員,到100結(jié)束
例:
#!/bin/bash
for i in `ls`
do
echo $i
done
省略in部分的for循環(huán)
for 變量 ==>省略in部分,會(huì)把命令行參數(shù)作為單詞列表
do
循環(huán)體
done
#!/bin/bash
#1-100的和
for num in {1..100}
do
((sum+=$num))
done
echo $sum
#循環(huán)列表是a-z字符
for num in {a..z}
do
echo -n $num
done
printf "\n"
#1-100求和,跳過偶數(shù)部分
for num in $(seq 1 2 100)
do
echo $num
((sum+=$num))
done
echo $sum
#缺省in
for cmd_var
do
echo $cmd_var
done
練習(xí)
(1)判斷用戶主目錄下是否存在file-dir和dir-dir的
子目錄,如果存在則提示用戶是否刪除,如果用戶輸
入的是 yes,則刪除,然后新建,否則結(jié)束 , 如果不
存在,則新建
(2)輸入一個(gè)指定路徑的目錄,將這個(gè)目錄下的文件和
目錄分開存放,將文件拷貝到用戶主目錄下的
file-dir子目錄下,將目錄拷貝到用戶主目錄下
的dir-dir子目錄下,并且統(tǒng)計(jì)文件和子目錄的個(gè)數(shù)
(3)輸出拷貝的文件和目錄的個(gè)數(shù)
#!/bin/bash
user=("/home/c/file-dir/" "/home/c/dir-dir/")
for dir in ${user[@]}
do
if [ -d $dir ]
then
read -p "是否刪除->$dir(y/n)" flase
case $flase in
y|Y|Yes|YES|yes)
echo "刪除$dir目錄"
rm $dir -rf
echo "新建$dir"
mkdir $dir
;;
n|N|NO|No|no)
echo "退出..."
exit 1
;;
*)
echo "選擇無效..."
exit 1
esac
else
echo "新建目錄"
mkdir $dir
fi
done
read -p "請輸入一個(gè)路徑> " mypath
if test -d $mypath
then
for file in `ls $mypath`
do
if test -f $mypath/$file
then
cp $mypath/$file ${user[0]}
((f++))
elif test -d $mypath/$file
then
cp $mypath/$file ${user[1]} -r
((d++))
fi
done
else
echo "輸入的不是一個(gè)路徑,請重試"
exit 1
fi
echo "拷貝的文件的個(gè)數(shù)$f"
echo "拷貝的文件的個(gè)數(shù)$d"
select in 語句
select 變量 in 單詞列表
do
語句
done
#!/bin/bash
select ch in a b c d
do
echo $ch
break
done
#!/bin/bash
select sys in windows linux macOS ios Android
do
case $sys in
windows)
echo "welcome using windows"
;;
linux)
echo "welcome using linux"
;;
macOS)
echo "welcome using macOS"
;;
ios)
echo "welcome using ios"
;;
Android)
echo "welcome using Android"
;;
esac
break
done
#!/bin/bash
#PS3 它是系統(tǒng)的一個(gè)環(huán)境變量,默認(rèn)值為#?
PS3="input >"
select ch in register login quit
do
case $ch in
register)
echo "注冊"
;;
login)
echo "登錄"
;;
quit)
echo "退出"
exit 1
;;
esac
done
select會(huì)生成一個(gè)選擇的列表,如下
1) a
2) b
3) c
4) d
#? ==>可以輸入用戶的選擇,這里只能
==>只能輸入數(shù)字,不能輸入單詞列
==>表中的選項(xiàng)
select如果沒有輸入ctrl+d或者break它會(huì)一直
執(zhí)行。
在工作或開發(fā)過程中select和case語句結(jié)合使用。
#PS3 它是系統(tǒng)的一個(gè)環(huán)境變量,默認(rèn)值為#?
PS3=“input >”
break和continue
用法:
break ==>退出一層循環(huán)
break n ==>退出n層循環(huán)
用法:
continue ==>跳過一層循環(huán)
continue n ==>跳過n層循環(huán)
例:
輸出:1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
#!/bin/bash
i=0
j=0
while ((++i))
do
j=0
while ((++j))
do
if [ $j -gt 4 ]
then
break
fi
if [ $i -gt 4 ]
then
break 2
fi
printf "%-4d" $((i*j))
done
printf "\n"
done
使用for循環(huán)實(shí)現(xiàn)
#!/bin/bash
j=1
for((i=1;i<=4;i++))
do
for((j=1;j*i<=4*i;j++))
do
printf "%d\t" $((j*i))
done
echo
done
shell中的函數(shù)
function 函數(shù)名()
{
}
1.shell中的函數(shù)沒有參數(shù)列表
2.shell中的函數(shù)沒有返回值類型
3.shell中的函數(shù)是使用function聲明的
4.shell的函數(shù)名的命名和c語言一樣
5.shell的函數(shù)如果不調(diào)用的話是不會(huì)執(zhí)行的
函數(shù)的調(diào)用
函數(shù)名 參數(shù)列表1 參數(shù)列表2
函數(shù)的參數(shù)通過位置變量獲取
$0 :腳本的名字
$1 $2 $3 …
$@
?
"
* "
?"@" 將命令行的參數(shù)原封不動(dòng)的傳遞給子函數(shù)
“$*” 將命令行的參數(shù)看成一個(gè)整體傳遞給子函數(shù)
shell中函數(shù)返回值的問題?
1.shell函數(shù)的的變量默認(rèn)都是全局變量,
可以直接使用,但是如果變量被local聲明了
它就變成了局部變量。
2.shell中的函數(shù)執(zhí)行的結(jié)果可以通過return返回,
return返回的時(shí)候可以通過$?獲取返回的結(jié)果。
返回值的范圍是[0-255]
3.shell的函數(shù)可以通過echo來返回字符串
通過ret=`` 或ret=$() 獲取結(jié)果,注意在
函數(shù)中使用一次echo即可,如果在函數(shù)內(nèi)
使用了多次echo,獲取的結(jié)果就是多次echo的值
中間通過空格分開
#!/bin/bash
function ShowVar()
{
echo $0
echo $1
echo $2
echo "----------------"
echo $@
echo "#########################"
}
#ShowVar $@
#ShowVar "$@"
#ShowVar $*
#ShowVar "$*"
function Add()
{
((sum=$1+$2))
}
Add 12 23 #函數(shù)中的sum是全局變量
echo $sum #可以直接獲取值
function Add1()
{
local sum
((sum=$1+$2))
return $sum
}
Add1 255 0 #函數(shù)中的local sum是局部變量,可以通過return返回【0-255】
echo $? #$?獲取上一步調(diào)用函數(shù)的結(jié)果
function ShowEcho()
{
((sum=$1+$2))
echo $sum
}
ret=`ShowEcho 255 255` #若函數(shù)需要返回【0-255】區(qū)間外的數(shù)據(jù)或者返回字符串
echo $ret #在函數(shù)中調(diào)用echo就行了,在調(diào)用函數(shù)執(zhí)行的時(shí)候需要加上命
#令置換,不能通過$?獲取結(jié)果
#ret=`ls /home/linux/` #通過對本次賦值理解為什么函數(shù)中的
#echo $ret #echo沒有輸出
練習(xí)1
1.輸入用戶的名字,判斷該系統(tǒng)上是否存在該用戶
2.若存在該用戶將這個(gè)用戶名和uid和gid顯示出來
#!/bin/bash
#打印行號
function check_user()
{
local line=`cat /etc/passwd | cut -d : -f 1 |grep "$1" -nw |cut -d : -f 1`
echo $line
}
#打印uid,pid
function show_user_info()
{
local info=`head -"$1" /etc/passwd | tail -1 | cut -d : -f 1,3-4`
echo $info
}
while true
do
read -p "請輸入用戶的名 > " name
if [ $name = quit ]
then
echo "退出用戶查詢系統(tǒng)"
exit 1
fi
line=`check_user $name`
if [ -z "$line" ]
then
echo "用戶不存在"
continue
else
echo "用戶存在,行號是$line"
fi
info=`show_user_info $line`
echo $info
done
練習(xí)2
封裝一個(gè)對數(shù)組成員求和的函數(shù),并將求得結(jié)果返回
#!/bin/bash
function array_sum()
{
local sum
for i
do
((sum+=$i))
done
echo $sum
}
arr=(11 22 33 44 55)
sum=`array_sum ${arr[@]}`
echo $sum
練習(xí)3
1.請輸入一個(gè)路徑,若此目錄下文件是以.c結(jié)尾
的文件,并且是普通文件,請將這個(gè)文件編譯,
若文件不是.c結(jié)尾的文件,請?jiān)谖募Y(jié)尾加上.bak文章來源:http://www.zghlxwxcb.cn/news/detail-553398.html
#!/bin/bash
read -p "輸入一個(gè)路徑" mypath
if test -d $mypath
then
for file in `ls $mypath`
do
if test -f $mypath/$file
then
case $mypath/$file in
*.c)
gcc $mypath/$file
mv a.out $mypath
;;
*)
base=${file%.*} #把原來的后綴清除
mv $mypath/$file $mypath/${base}.bak #添加新的后綴
;;
esac
fi
done
fi
練習(xí)4
1.編寫一個(gè)shell腳本完成如下功能 :
1.在家目錄下創(chuàng)建文件夾filer
2.遍歷當(dāng)前文件夾下的文件,如果是普通文件則放入創(chuàng)建的filer中
3.打印出放入filer文件夾中的文件數(shù)目文章來源地址http://www.zghlxwxcb.cn/news/detail-553398.html
#!/bin/bash
cd
mkdir filer
for file in `ls `
do
if test -f $file
then
cp $file ./filer
((f++))
fi
done
echo "拷貝文件的個(gè)數(shù)$f"
到了這里,關(guān)于linux命令與shell編程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!