# Linux常用命令
## 1.日常操作指令
### 1.pwd
>查看當前所在的目錄
### 2.date
> 查看當前系統時間
### 3.who last
> who 查看當前在線 (whoami查看當前登錄的用戶)
>
> last 查看最近的登錄歷史
### 4.ls
> ls / 查看根目錄下的所有內容
>
> ls -l 以列表的方式展示 -a 顯示隱藏文件 -h 顯示文件大小
## 2.常用操作
### 1.創建文件夾
> 創建文件 。
>
> mkdir abc 相對路徑的寫法
>
> mkdir -p aaa/bbb/ccc 可以創建多層文件
>
> mkdir /data 絕對路徑的寫法
### 2.刪除文件夾
> rmdir 可以刪除空目錄
>
> rm -r aaa 可以把整個文件夾以及其中所有的子節點刪除。(帶有刪除提示)
>
> 注意:r表示遞歸。(recursion)
>
> rm -rf aaa 強制刪除(無提示)
>
> rm -rf /* 刪除全部
### 3.修改文件夾名稱
> mv aaa hhh 修改文件名稱
>
> mv file.1 /data/hello.1 移動文件到指定目錄并修改文件名
### 4.創建文件
> touch file.1 創建一個空文件
>
> echo "hello linux ..." > file.1 利用重定向將輸出內容寫入到file.1文件中
>
> echo "bye,bye!" >> file.1 將指定內容重定向到目標,不覆蓋原有內容
>
> (> 會覆蓋文件原有內容,>> 在文件原有內容的基礎上進行追加)
>
> 可以使用cat 命令查看文件內容。
>
> ls > file.2 也是可以的,關于>用法:只要前面有輸出內容都可以重定向到后面的文件中
``使用vi創建文件:``
> vi file.3
>
> 1.一般模式:只接受快捷鍵 ,進入vi編輯器的默認模式。
>
> ``gg:``直接跳到首行
>
> ``G:``直接跳到尾行
>
> ``i:``進入編輯模式
>
> ``a:``在光標的后一位開始插入
>
> ``A:``在該行的最后插入
>
> ``dd:``刪除當前行 3dd 一次刪除光標后3行
>
> ``yy:``復制當前行 3yy 一次復制3行 ``p:``進行粘貼
>
> ``v Ctrl+v Shift+v:``分別對應字符模式,塊模式,行模式。該模式下y復制,p粘貼
>
> 2.編輯模式:Esc退出編輯模式回到一般模式。
>
> 3.底行模式 : 輸入: 表示進入底行模式。
>
> ``%s/haha/sbsbsb:``查到所有haha字符并替換成sbsbsb
>
> ``/指定內容:``直接查找到指定內容
>
> ``wq`` 保存文件并退出vi
>
> ``wq!`` 強制保存文件,并退出vi
>
> q!強制退出
>
> ``e!`` 放棄所有修改,從上次保存文件開始再編輯
> cat 查看文件 。
>
> cat -n 文件名稱 顯示行號查看文件。
>
> cat -n test.log | more 使用管道命令 查看并分頁顯示文件。
> more /etc/profile more 指令是一個基于 VI 編輯器的文本過濾器,以全屏幕的方式按頁顯示文本文件內容
>
> 空格 向下翻一頁。
>
> 回車 向下翻一行。
>
> q 退出more 不再顯示文件內容。
>
> Ctrl + F 向下滾動一屏幕。
>
> Ctrl + B 返回上一屏。
>
> = 輸出當前行號。
>
> :f 輸出文件名和當前行號。
>
>
>
> less 指令用來分屏查看文件內容,它的功能與 more 指令類似,但是比 more 指令更加強大,支持 各種顯示終端。less 指令在顯示文件內容時,并不是一次將整個文件加載之后才顯示,而是根據顯示 需要加載內容,對于顯示大型文件具有較高的效率。
>
> less 要查看的文件
>
> 空格 向下翻動一頁。
>
> pagedow 下翻一頁
>
> pageup 上翻
>
> q 退出 。
>
> /字符串 向下查找
>
> ?字符串 向上查找。
> head -n 5 /etc/profile 顯示頭五行。
>
> tail 文件名 查看文件后10行 。
>
> tail -n 5 文件名
>
> tail -f 文件 實時追蹤該文檔的更新 。
> 軟鏈接也叫符號鏈接,類似于 windows 里的快捷方式,主要存放了鏈接其他文件的路徑
>
> 基本語法
>
> ln -s 原文件或目錄 軟鏈接名 (功能描述:給原文件創建一個軟鏈接)
>
> ln -s /root linktoroot
>
> rm -rf linktoroot (注意 linktoroot 后不要加/)
> history 查看歷史命令 。
>
> history 10
>
> !155
> date
>
> 1) date (功能描述:顯示當前時間)
>
> 2) date +%Y (功能描述:顯示當前年份)
>
> 3) date +%m (功能描述:顯示當前月份)
>
> 4) date +%d (功能描述:顯示當前是哪一天)
>
> 5) date "+%Y-%m-%d %H:%M:%S"(功能描述:顯示年月日時分秒)
>
> date -s 字符串時間 date -s "2019-10-10 10:10:10" 設置當前系統時間。
> cal 顯示本月日歷 calendar
> locate 指令可以快速定位文件路徑。locate 指令利用事先建立的系統中所有文件名稱及路徑的 locate 數據庫實現快速定位給定的文件。Locate 指令無需遍歷整個文件系統,查詢速度較快。為了保 證查詢結果的準確度,管理員必須定期更新 locate 時刻。 ?基本語法locate 搜索文件 ?特別說明 由于 locate 指令基于數據庫進行查詢,所以第一次運行前,必須使用 updatedb 指令創建 locate 數 據庫。
>
> updatedb 更新locate 數據庫 。
>
> locate 文件名稱。
> grep 和管道指令 。
>
> grep 過濾查找 , 管道符,“|”,表示將前一個命令的處理結果輸出傳遞給后面的命令處理。
>
> grep [選項] 查找內容 源文件
>
> -n number 顯示匹配行及行號。
>
> -i ignore 忽略大小寫比較。
>
> cat hello.txt | grep -ni haha
>
>
### 5.文件權限操作
> 權限解讀:drwxr-xr-x
>
> d:標識節點類型(d:文件夾 -:文件 l:鏈接)
>
> r:可讀 w:可寫 x:可執行
>
> 第一組rwx: 表示這個文件的擁有者對它的權限
>
> 第二組rwx: 表示這個文件的所屬組對它的權限
>
> 第三組rwx: 表示這個文件的其他用戶(相對于上面兩類用戶)對它的權限
>
> 修改權限
>
> ? 有權限就是1 沒權限就是0
>
> ? rwx 111 7
>
> ? r-x 101 5
>
> ? r-x 101 5
>
> chmod 755 文件名稱 。
>
> u 表示文件的擁有者 。
>
> g 表示組的權限 。
>
> o 表示其他人。
>
> a 所有 。
>
> chmod u-w,g+r
### 6.基本用戶管理
>1、添加用戶
>
>? useradd 用戶名
>
>? passwd 密碼
>
>useradd -d /home/pet tom 添加用戶的同時指定家目錄。
>
>userdel -r xm 刪除小明 連同家目錄 。
>
>userdel xm 刪除小明保留家目錄。
>
>查詢用戶。 id 用戶名
>
>顯示用戶id 所在組的id 組名。
> 添加組 groupadd 組名
>
> 刪除組 groupdel 組名
> useradd -g 用戶組 用戶名 創建用戶的時候就指定用戶組。
>
> usermod -g 用戶組 用戶名 修改用戶組
> /etc/passwd 文件 用戶(user)的配置文件
>
> 記錄用戶的各種信息 每行的含義:用戶名:口令:用戶標識號:組標識號:注釋性描述:主目錄:登錄 Shell
>
> /etc/shadow 口令的配置文件
>
> 每行的含義:登錄名:加密口令:最后一次修改時間:最小時間間隔:最大時間間隔:警告時間:不活動 時間:失效時間:標志
>
> /etc/group 組(group)的配置文件,記錄 Linux 包含的組的信息
>
> 每行含義:組名:口令:組標識號:組內用戶列表 ject
>2、用戶的切換
>
>? su 用戶名 切換成指定用戶
>
>? exit 切換回原來的用戶。 從高權限到低權限用戶不需要密碼,反之需要。
>
>? su 切換成root
>
>? sudo 執行當前命令的時候使用root權限
>
>? 權限配置的文件在/etc/sudoers文件中
>
>3、主機名稱
>
>? hostname 查看主機名稱
>
>? /etc/sysconfig/network 可以永久修改主機名稱
>
>4、IP地址修改
>
>? ifconfig 查看ip信息
>
>? /etc/sysconfig/network-scripts/ifcfg-eth0
### 7.掛載
>rpm是由紅帽公司開發的軟件包管理方式,使用rpm我們可以方便的進行軟件的安裝、查詢、卸載、升級等工作。 但是rpm軟件包之間的依賴性問題往往會很繁瑣,尤其是軟件由多個rpm包組成時。
>
>Yum 能夠從指定的服務器自動下載RPM包并且安裝,可以自動處理依賴性關系,并且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
>
>1.當有圖形化界面的時候,會自動掛載到/media文件夾中,里面的packages就有我們需要的各種rpm安裝包
>
>2.當我們安裝非圖形化界面的Linux后則需要手動掛載
>
>? 1.首先創建掛載后存放光盤內容的目錄。
>
>? mkdir /mnt/cdrom
>
>? 2.使用掛載命令,將光盤中的內容掛載到指定目錄。
>
>? mount -t iso9660 -o ro /dev/cdrom /mnt/cdrom
>
>? (-t 表示文件系統的設備類型,iso9660 為光盤。)
>
>? (-o 表示文件掛上來后的模式,是可讀還是可寫 ro 只讀)
>
>? 3.取消掛載
>
>? umount /mnt/cdrom
### 8.查看文件大小
>du -s /opt 查看匯總之后的文件大小
>
>du -sh /opt 查看匯總之后的人能看懂的。(帶單位)而不是顯示當前文件在linux文件系統中占多少元數據
### 9.查看分區大小
>df -h 查看分區使用情況
### 10.關機,重啟
> shutdown
>
> shutdown -h now : 表示立即關機
>
> shutdown -h 1 : 表示 1 分鐘后關機
>
> shutdown -r now: 立即重啟
>
> halt
>
> 就是直接使用,效果等價于關機
>
> reboot
>
> 就是重啟系統。
>
> syn : 把內存的數據同步到磁盤
>
> 當我們關機或者重啟時,都應該先執行以下 sync 指令,把內存的數據寫入磁盤,防止數據丟失。 x
### 11.壓縮,解壓縮。
> gzip 將文件壓縮 。
>
> gzip a.txt 壓縮文件,壓縮之后不保留原文件 。將生成 a.txt.gz 后綴文件。
>
> gunzip 解壓。
>
> gunzip a.txt.gz 解壓文件,不保留原文件。
> 壓縮文件或目錄的指令 。
>
> zip -r aa.zip a 將當前目錄下的a文件夾 ,壓縮成aa.zip
>
> zip -r package.zip /home/ 將home下的所有內容壓縮成package.zip 。
>
> 解壓縮文件或者目錄的指令。
>
> unzip -d /opt/ package.zip 將指定zip包中的內容解壓到指定目錄。
> tar 打包指令,最后打包文件是.tar.gz的文件。
>
> -c 產生.tar打包文件
>
> -v 顯示詳細信息
>
> -f 指定壓縮后的文件名
>
> -z 打包同時壓縮
>
> -x 解包.tar文件
>
> tar -zcvf ab.tar.gz a.txt b.txt 將a.txt 和 b.txt 打包成tar.gz格式
>
> tar -zcvf home.tar.gz /home/ 將home目錄下的所有文件打包成 home.tar.gz
>tar -zxvf a.tar.gz 將a.tar.gz文件解壓到當前路徑下 。
>
>tar -zxvf a.tar.gz -C /opt/ 解壓到指定目錄下,需要加入 -C 參數,并且指定文件要事先存在。
## 3.Linux目錄結構
/bin:存放必要的命令、標準系統實用程序、增加的用戶程序。
/boot:存放啟動Linux時使用的一些核心文件、內核。
/dev:存放設備文件。
/etc:存放設置文件、系統管理所需要的配置文件和子目錄。
/home:用戶文件的主目錄,存放用戶數據。
/lib:存放系統最基本的動態鏈接共享庫、必要的運行庫。
/lost+found:存放系統意外關機時未保存的文件。
/media: linux系統會自動識別一些設備,例如U盤、光驅等等,當識別后,linux會把識別的設備掛載到這個目錄下。
/mnt:系統提供該目錄是為了讓用戶臨時掛載別的文件系統的,我們可以將光驅掛載在/mnt/上,然后進入該目錄就可以查看光驅里的內容了。
/opt:這是給主機額外安裝軟件所擺放的目錄。比如你安裝一個ORACLE數據庫則就可以放到這個目錄下。默認是空的。
/proc:這個目錄是一個虛擬的目錄,它是系統內存的映射,我們可以通過直接訪問這個目錄來獲取系統信息。
/root:該目錄為系統管理員,也稱作超級權限者的用戶主目錄。
/sbin:s就是Super User的意思,這里存放的是系統管理員使用的系統管理程序。
/selinux:這個目錄是Redhat/CentOS所特有的目錄,Selinux是一個安全機制,類似于windows的防火墻,但是這套機制比較復雜,這個目錄就是存放selinux相關的文件的。
/srv:該目錄存放一些服務啟動之后需要提取的數據。
/sys:這是linux2.6內核的一個很大的變化。該目錄下安裝了2.6內核中新出現的一個文件系統 sysfs 。sysfs文件系統集成了下面3種文件系統的信息:針對進程信息的proc文件系統、針對設備的devfs文件系統以及針對偽終端的devpts文件系統。該文件系統是內核設備樹的一個直觀反映。當一個內核對象被創建的時候,對應的文件和目錄也在內核對象子系統中被創建。
/tmp:這個目錄是用來存放一些臨時文件的。
/usr:這是一個非常重要的目錄,用戶的很多應用程序和文件都放在這個目錄下,類似于windows下的program files目錄。
/usr/bin:系統用戶使用的應用程序。
/usr/sbin:超級用戶使用的比較高級的管理程序和系統守護程序。
/usr/src:內核源代碼默認的放置目錄。
/var:這個目錄中存放著在不斷擴充著的東西,我們習慣將那些經常被修改的目錄放在這個目錄下。包括各種日志文件。
/run:是一個臨時文件系統,存儲系統啟動以來的信息。當系統重啟時,這個目錄下的文件應該被刪掉或清除。如果你的系統上有 /var/run 目錄,應該讓它指向 run。
# shell編程
## 1、變量
注意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量名的命名須遵循如下規則:
- 命名只能使用英文字母,數字和下劃線,首個字符不能以數字開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
1.變量可以被重新定義
2.使用readonly可以將變量定義為只讀
3.unset可以刪除變量 不能刪除只讀變量
```shell
echo "hello the world!"
your_name="zhangchaomiao"
echo ${your_name}
myWeb="http://www.baidu.com"
readonly myWeb
#myWeb="http://www.sohu.com"
echo ${myWeb}
home="hubei"
unset home
echo ${home}//空
```
除了顯式地直接賦值,還可以用語句給變量賦值,如:
```shell
for file in ls /etc
或
for file in $(ls /etc)
```
## 2、變量類型
運行shell時,會同時存在三種變量:
- **1) 局部變量** 局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啟動的程序不能訪問局部變量。
- **2) 環境變量** 所有的程序,包括shell啟動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。
- **3) shell變量** shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行
## 3、shell字符串
**字符串是shell編程中最常用最有用的數據類型(除了數字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。**
單引號字符串的限制:
- 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符后也不行),但可成對出現,作為字符串拼接使用。
```shell
your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
```
輸出結果為
```shell
Hello, I know you are "runoob"!
```
雙引號的優點:
- 雙引號里可以有變量
- 雙引號里可以出現轉義字符
### 拼接字符串
```shell
your_name="runoob"
# 使用雙引號拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用單引號拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
輸出結果為
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
```
### 獲取字符串長度
```shell
string="abcde"
echo ${#string} #輸出 5
```
### 提取子字符串
```shell
#參數1表示從索引1處開始提取 參數4表示截取4個字符
string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo
```
### 查找子字符串
```shell
#查找字符 i 或 o 的位置(哪個字母先出現就計算哪個):
string="runoob is a great site"
echo expr index "$string" io # 輸出 4
```
## 4、shell數組
### 創建數組
```shell
array_name=(value0 value1 value2 value3)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
可以不使用連續的下標,而且下標的范圍沒有限制。
```
### 讀取數組
```shell
#使用 @ 符號可以獲取數組中的所有元素
echo ${array_name[@]}
```
### 獲取數組長度
```shell
#*或@都可以
echo ${#array_name[*]}
```
### 獲取數組單個元素長度
```shell
#獲取第n個數組元素的長度
echo ${#array_name[n]}
```
## 5、傳遞參數
```shell
#$0為執行的文件名 $n為第n個參數
echo "執行的文件名:$0";
echo "第一個參數為:$1";
echo "第二個參數為:$2";
echo "第三個參數為:$3";
echo "傳遞到腳本的參數個數:$#";
#使用""將$*括起來傳的參數等價于一個參數"a b c"
#使用""將$@括起來傳的參數等價于三個參數"a""b""c"
echo "顯示所有向腳本傳遞的參數:"$*"";
echo "腳本運行的當前進程ID號:$$";
echo "后臺運行的最后一個進程的ID號:$!";
echo "顯示shell使用的當前選項:$-";
echo "顯示最后命令的退出狀態0表示無錯誤:$?";
```
## 6、運算符
1.expr是一款表達式計算工具
2.表達式和運算符之間必須要有空格
3.完整的表達式要被``包含而不是單引號
```shell
val=`expr 2 + 2`
echo "兩數之和為 : $val"
```
### 算術運算符
```shell
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
#乘號做運算時需在前邊加上\
val=`expr $a \* $b`
echo "a * b : $val"
#a/b結果為0
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
#if與括號與變量間全都要加上空格
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
```
### 關系運算符
```shell
:<<EOF
-eq:檢測兩個數是否相等,相等返回 true
-ne:檢測兩個數是否不相等,不相等返回 true
-gt:檢測左邊的數是否大于右邊的
-lt:檢測左邊的數是否小于右邊的
-ge:檢測左邊的數是否大于等于右邊的
-le:檢測左邊的數是否小于等于右邊的
EOF
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
```
### 邏輯運算符
```shell
#-O 邏輯或運算 || 短路或
#-a 邏輯與運算 && 短路與
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
```
### 字符串運算符
```shell
:<<EOF
=檢測字符串是否相等 !=
-z檢測字符串長度是否為0 為0返回true
-n長度不為0返回true
$ 檢測字符串是否為空 不為空返回true
EOF
a="abc"
b="efg"
if [ -n "$a" ]
then
echo "-n $a : 字符串長度不為 0"
else
echo "-n $a : 字符串長度為 0"
fi
```
### 文件測試運算符
```shell
:<<!
文件測試運算符
-b 檢測文件是否是塊設備文件
-c 檢測文件是否是字符設備文件
-d 檢測文件是否是目錄
-f 檢測文件是否是普通文件
-g 檢測文件是否設置了SGID位
-k 檢測文件是否設置了粘著位
-p 檢測文件是否是有名管道
-u 檢測文件是否設置了SUID位
-r 檢測文件是否可讀
-w 檢測文件是否可寫
-x 檢測文件是否可執行
-s 檢測文件是否為空 不為空返回true
-e 檢測文件(包括目錄)是否存在
!
file="/root/桌面/test.sh"
if [ -r $file ]
then
echo "文件可讀"
else
echo "文件不可讀"
fi
if [ -w $file ]
then
echo "文件可寫"
else
echo "文件不可寫"
fi
if [ -x $file ]
then
echo "文件可執行"
else
echo "文件不可執行"
fi
if [ -f $file ]
then
echo "文件為普通文件"
else
echo "文件為特殊文件"
fi
if [ -d $file ]
then
echo "文件是個目錄"
else
echo "文件不是個目錄"
fi
if [ -s $file ]
then
echo "文件不為空"
else
echo "文件為空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi
```
## 7、echo命令
```shell
#最外層雙引號可以省略
echo \"It is a test\"
#read命令從標準輸入中讀取一行 并把每個字段的值指定給shell變量
#-p輸入提示文字 -n輸入字符長度限制 -t輸入限時 -s隱藏輸入內容
read -p "請輸入一段文字" -n 6 name
echo "$name It is a test"
#-e開啟轉義 -n換行 -c不換行
echo -e "OK! \n"
echo "It is a test"
#命令使用``
echo `date`
```
## 8、printf命令
```shell
:<<!
轉義序列
\a 警告字符,通常為ASCII的BEL字符
\b 后退
\c 不顯示輸出結果中任何結尾的換行字符
\f 換頁
\n 換行
\r 回車
\t 水平制表符
\v 垂直制表符
\\ 一個字面上的反斜杠字符
\ddd 表示1到3位數八進制值的字符,僅在格式字符串中有效
\0ddd 表示1到3位的八進制值字符
!
printf "%-10s %-8s %-4s\n" 姓名 性別 體重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 楊過 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
# format-string為雙引號
printf "%d %s\n" 1 "abc"
# 單引號與雙引號效果一樣
printf '%d %s\n' 1 "abc"
# 沒有引號也可以輸出
printf %s abcdef
# 格式只指定了一個參數,但多出的參數仍然會按照該格式輸出,format-string 被重用
printf %s abc def
printf "%s\n" abc def
printf "%s %s %s\n" a b c d e f g h i j
# 如果沒有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
```
## 9、流程控制
### if語句
```shell
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "沒有符合的條件"
fi
```
### for循環
? 當變量值在列表里,for循環即執行一次所有命令,使用變量名獲取列表中的當前取值。命令可為任何有效的shell命令和語句。in列表可以包含替換、字符串和文件名。in列表是可選的,如果不用它,for循環使用命令行的位置參數。
```shell
#一般格式
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
#寫成一行
for var in item1 item2 ... itemN; do command1; command2… done;
```