国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

linux命令與shell編程

這篇具有很好參考價(jià)值的文章主要介紹了linux命令與shell編程。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、概念

linux內(nèi)存

linux命令與shell編程,linux,服務(wù)器,運(yùn)維

嵌入式

嵌入式以計(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ū)

linux命令與shell編程,linux,服務(wù)器,運(yùn)維
代碼區(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 //>>追加,在文件的尾部新起一行,將字符串寫入這一行

例:
linux命令與shell編程,linux,服務(wù)器,運(yùn)維
在終端輸入echo $? ==>可以查看int main函數(shù)的返回值

tty命令->查看當(dāng)前終端號

linux命令與shell編程,linux,服務(wù)器,運(yùn)維

clear 命令

清屏 或者 ctrl + l

ldd命令 ->查看文件依賴哪些庫

ldd + 文件名
linux命令與shell編程,linux,服務(wù)器,運(yùn)維

printenv命令->打印環(huán)境變量

eog命令 + 圖片名-> 顯示圖片

權(quán)限掩碼 umask命令

linux命令與shell編程,linux,服務(wù)器,運(yùn)維

修改權(quán)限掩碼

umask 0(把權(quán)限掩碼去掉)
linux命令與shell編程,linux,服務(wù)器,運(yù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)常用的一種寫法
例:
linux命令與shell編程,linux,服務(wù)器,運(yùn)維

文件搜索命令 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
linux命令與shell編程,linux,服務(wù)器,運(yùn)維

新添加用戶沒有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盤的目錄
linux命令與shell編程,linux,服務(wù)器,運(yùn)維

查看磁盤掛載相關(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 保存退出

指定磁盤類型的命令

linux命令與shell編程,linux,服務(wù)器,運(yùn)維
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)入下一層或上一層失效
linux命令與shell編程,linux,服務(wù)器,運(yù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

linux命令與shell編程,linux,服務(wù)器,運(yùn)維
linux命令與shell編程,linux,服務(wù)器,運(yùn)維

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ū)別

  1. ./執(zhí)行腳本的時(shí)候需要權(quán)限
    bash/source執(zhí)行腳本的時(shí)候不需要權(quán)限

  2. ./和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 VAR1VAR3="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

#!/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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Shell 分析服務(wù)器日志常用命令

    1、查看有多少個(gè)IP訪問: 日志文件的第一列是IP地址 2、查看某一個(gè)頁面被訪問的次數(shù): 3、查看每一個(gè)IP訪問了多少個(gè)頁面: 4、將每個(gè)IP訪問的頁面數(shù)進(jìn)行從小到大排序: 5、查看某一個(gè)IP訪問了哪些頁面: 6、去掉搜索引擎統(tǒng)計(jì)的頁面: 7、查看2015年8月16日14時(shí)這一個(gè)小時(shí)內(nèi)

    2024年02月14日
    瀏覽(22)
  • 這些Shell分析服務(wù)器日志命令集錦,優(yōu)秀!

    自己的小網(wǎng)站跑在阿里云的 ECS 上面, 偶爾也去分析分析自己網(wǎng)站服務(wù)器日志,看看網(wǎng)站的訪問量??纯从袥]有黑客搞破壞!于是收集,整理一些服務(wù)器日志分析命令,大家可以試試! uniq -c 相當(dāng)于分組統(tǒng)計(jì)并把統(tǒng)計(jì)數(shù)放在最前面 訪問量最大的前20個(gè)ip 對比httpd.conf中MaxClients的數(shù)

    2024年02月19日
    瀏覽(24)
  • VMware vCenter服務(wù)器常用的巡檢命令、運(yùn)維命令和PowerShell腳本

    一、前言 最近整理一些VMware vCenter和Esxi常用的巡檢命令和運(yùn)維命令如下: 二、巡檢命令 三、運(yùn)維命令 運(yùn)維常用命令: 四、Powershell腳本 以上就是vCenter和ESXi常用的運(yùn)維與監(jiān)控命令,可以幫助vSphere管理員管理和監(jiān)控環(huán)境。

    2024年02月11日
    瀏覽(22)
  • java實(shí)現(xiàn)連接遠(yuǎn)程服務(wù)器,并可以執(zhí)行shell命令

    你可以使用Java中的SSH庫來連接遠(yuǎn)程服務(wù)器并執(zhí)行shell命令。下面是一個(gè)簡單的示例代碼: 請注意替換 your_host , your_username , your_password 和 your_shell_command 為實(shí)際的遠(yuǎn)程服務(wù)器信息和要執(zhí)行的shell命令。該示例代碼使用JSch庫來建立SSH連接并執(zhí)行命令。

    2024年01月20日
    瀏覽(33)
  • 運(yùn)維 | 查看 Linux 服務(wù)器 IP 地址

    大多數(shù)在操作 Linux 系統(tǒng)時(shí),我們經(jīng)常需要知道服務(wù)器的 IP 比便于后續(xù)的一系列操作,這時(shí)候有快速查看主機(jī) IP 的命令行操作,能夠有效的幫助我們 本章節(jié)主要記錄一些常用查看服務(wù)器 IP 的命令,希望對大家有所幫助。 查看 Linux 服務(wù)器的 IP 地址的命令大體上有以下幾種。

    2024年04月27日
    瀏覽(103)
  • Shell腳本常用命令及如何通過shell腳本實(shí)現(xiàn)服務(wù)器上文件的上傳和下載

    Shell腳本常用命令 簡介 1、什么是shell: Shell 是一個(gè)用 C 語言編寫的應(yīng)用程序,這個(gè)應(yīng)用程序提供了一個(gè)界面,用戶通過這個(gè)界面訪問操作系統(tǒng)內(nèi)核的服務(wù)。Shell 腳本(shell script),是一種為 shell 編寫的腳本程序,擴(kuò)展名為.sh。 2、如何編寫shell腳本: 文本編輯器(可以使用

    2024年02月03日
    瀏覽(31)
  • 【運(yùn)維】Linux 跨服務(wù)器復(fù)制文件文件夾

    如果是云服務(wù) 建議用內(nèi)網(wǎng)ip scp是secure copy的簡寫,用于在Linux下進(jìn)行遠(yuǎn)程拷貝文件的命令,和它類似的命令有cp,不過cp只是在本機(jī)進(jìn)行拷貝不能跨服務(wù)器,而且scp傳輸是加密的??赡軙?huì)稍微影響一下速度。當(dāng)你服務(wù)器硬盤變?yōu)橹蛔x read only system時(shí),用scp可以幫你把文件移出來

    2024年02月08日
    瀏覽(109)
  • Linux&Shell--多服務(wù)器自動(dòng)登錄連接

    sshpass 是一個(gè)命令行工具,用于自動(dòng)化SSH密碼認(rèn)證。它通常在腳本或自動(dòng)化任務(wù)中使用,其中您需要提供密碼以建立SSH連接,而無需用戶干預(yù)??梢灾苯訉⒚艽a作為命令行參數(shù)或通過文件提供,以便在建立SSH連接時(shí)自動(dòng)輸入密碼。這對于需要自動(dòng)化處理SSH連接的任務(wù)非常有用

    2024年02月03日
    瀏覽(23)
  • DELL服務(wù)器全系列ipmitool命令調(diào)節(jié)風(fēng)扇轉(zhuǎn)速(shell+windows軟件)

    DELL服務(wù)器全系列ipmitool命令調(diào)節(jié)風(fēng)扇轉(zhuǎn)速(shell+windows軟件)

    首先要確保你的電腦和服務(wù)器在同一個(gè)局域網(wǎng),并且設(shè)置好帶外地址可以ping通,然后電腦安裝ipmitool 1.1參數(shù)解析 -I lanplus 使用 lanplus 作為通信接口。lanplus 是 IPMI v2.0 over LAN (通常是稱為“LAN+”或簡稱“l(fā)anplus”) 的接口類型。 -H 192.168.2.1 設(shè)置目標(biāo) IP 地址為 192.168.2.1。這是你想

    2024年03月24日
    瀏覽(31)
  • 【Linux 服務(wù)器運(yùn)維】定時(shí)任務(wù) crontab 詳解 | 文末送書

    【Linux 服務(wù)器運(yùn)維】定時(shí)任務(wù) crontab 詳解 | 文末送書

    本文思維導(dǎo)圖概述的主要內(nèi)容: 1.1 什么是 crontab Crontab 是一個(gè)在 Unix 和 Linux 操作系統(tǒng)上 用于定時(shí)執(zhí)行任務(wù) 的工具。它允許用戶創(chuàng)建和管理計(jì)劃任務(wù),以便在特定的時(shí)間間隔或時(shí)間點(diǎn)自動(dòng)運(yùn)行命令或腳本。Crontab 是 cron table 的縮寫, cron 指的是 Unix 系統(tǒng)中的一個(gè)后臺進(jìn)程,它

    2024年02月08日
    瀏覽(129)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包