====== Linux Shell Instruction 說明 ====== ===== shell program structure ===== #!/bin/bash function test1(){ echo "This is function test1, first parameter $1" } function test2(){ echo "This is function test2, second parameter $2" } test1 1 test2 1 2 result: This is function test1, first parameter 1 This is function test2, second parameter 2 ===== if ===== 使用 if 條件判斷語法要注意[ ]中括號的兩端必須要有一個空白字元,且最後必須使用 fi 結尾,以下範例介紹 if 的用法,以及比較二個字串是否相等。 === if 寫法 if [ 'xxx' == 'xxx' ] ; then # do something fi === if else 寫法 if [ 'xxx' == 'xxx' ] ; then # do something else # do something fi === if, else if, else 寫法 if [ 'xxx' == 'xxx' ] ; then # do something elif [ 'xxx' == 'xxx' ] ; then # do something else # do something fi ==== 檔案判斷 ==== ^ 判斷式 ^ 說明 ^ 備註 ^ | -e | 檔名是否存在 | | | -f | 檔名是否存在且為檔案 | | | -d | 檔名是否存在且為目錄 | | | -x | 檔名是否存在且可執行 | | | -r | 檔名是否存在且可讀取 | | | -w | 檔名是否存在且可寫入 | | | -L | 是否為軟連結 | | | -S | 檔名是否存在且為socket | | | file1 -nt file2 | file1 比 file2 新傳回 ture | | | file1 -ot file2 | file1 比 file2 舊傳回 ture | | | file1 -ef file2 | file1 與 file2 為同一檔案傳回 ture | | ==== 數字比較 ==== ^ 判斷式 ^ 說明 ^ 備註 ^ | "$a" -eq "$b" | 兩數字是否相等 | | | "$a" -ne "$b" | 兩數字是否不相等 | | | "$a" -gt "$b" | a是否大於b | | | "$a" -ge "$b" | a是否大於等於b | | | "$a" -lt "$b" | a是否小於b | | | "$a" -le "$b" | a是否小於等於b | | ==== 字串比較 ==== ^ 判斷式 ^ 說明 ^ 備註 ^ | "$str1" = "$str2" | 兩字串是否相等 | | | "$str1" == "$str2" | 兩字串是否相等 | | | "$str1" != "$str2" | 兩字串是否不相等 | | | -n "$str1" | 字串長度是否不為 0 | | | -z "$str1" | 字串長度是否為 0 | | ==== 多重條件比較 ==== ^ 判斷式 ^ 說明 ^ 備註 ^ | 條件1 -a 條件2 | 條件 1和條件 2都成立時| | | 條件1 -o 條件2 | 條件 1或條件 2成立時 | | ex1:判斷是否為檔案 if [ -f somefile ]; then echo "Yes" fi 也可以寫成下面這種 if test -f somefile; then echo "Yes" fi ex2:判斷是否為目錄 if [ -d somedir ]; then echo "Yes" fi ex3 : 判斷檔案是否存在,且可讀取 if [ ! -r ${ext_target_board}.conf ]; then echo "Error: Invalid target board - ${ext_target_board}."; usage allunknown 1; fi ===== case ===== #!/bin/bash op=$1 case ${op} in condition1) cmd_1 cmd_2 ;; condition2) cmd_1 cmd_2 ;; *) cmd_1 cmd_2 exit 1 #可以加退出值 ;; esac ===== grep ===== grep 的全寫是 “global regular expression print”,是 Linux 系統內置的字串搜索工具, 它可以用作搜索檔案的內容, 除了搜索檔案內容外, 也可以透過管線 (pipe) 輸入內容搜索。 grep -r "search_string" ./* ===== execute shell method ===== shell程序運行有多種方法,這裏介紹三種方法: 第一種:./xx.sh      和運行二進制可執行程序的方法一樣,這樣運行shell必須要求shell具有可執行權限。chmod a+k xx.sh來添加可執行權限 第二種:source xx.sh  source是linux的一個命令,這個命令就是用來執行腳本程序的,這樣運行時不需要腳本具有可執行權限 第三種:bash xx.sh    bash是一個腳本程序的解釋器,本質上是一個可執行程序。這樣執行相當於我們執行了bash程序,然後把xx.sh作為argv[1]傳給他運行 ===== rm ===== 這是移除的指令,相當於 dos 下的 del 指令!這裡要注意的是,通常在 Linux 系統下,為了怕檔案被誤殺,所以都已經有 -i 這個參數, -i 是指每個檔案被殺掉之前都會確認一次。 rm -r dirname #要刪除目錄, 需要加入 -r 參數, -r 參數代表 recursive 遞迴刪除, 使用時要格外小心, 因為會把目錄內所有檔案及目錄一同刪除 ===== read ===== read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] -a 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。 -d 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志。 -p 后面跟提示信息,即在输入前打印提示信息。 -e 在输入的时候可以使用命令补全功能。 -n 后跟一个数字,定义输入文本的长度,很实用。 -r 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了。 -s 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码。 -t 后面跟秒数,定义输入字符的等待时间。 -u 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的。 #!/bin/bash #这里默认会换行 echo "請輸入人名 : " read name echo "你輸入的名字是 $name" exit 0 #退出 Result : 請輸入人名 : Don 你輸入的名字是 Don =============================================================== #!/bin/bash if read -t 5 -p "請輸入人名 :" name then echo "你輸入的名字是 $name" else echo "\nSorry,Over 5 seconds" fi exit 0 =============================================================== read -n1 -p "Do you want to continue [Y/N]?" answer case $answer in Y | y) echo "fine ,continue";; N | n) echo "ok,good bye";; *) echo "error choice";; esac exit 0 ===== readlink ===== Linux中的readlink命令用於列印解析的符號連結或規範檔案名。 readlink -e:通過遞迴跟隨給定名稱的每個元件中的每個符號連結,此選項將規範化,所有元件必須存在。 ubuntu@ubuntu2004:~/test$ ls flash.sh ubuntu@ubuntu2004:~/test$ cd .. ubuntu@ubuntu2004:~$ ln -s test/flash.sh don.sh ubuntu@ubuntu2004:~$ ls Desktop don.sh l4t-gcc Pictures snap test workspace Documents Downloads Music Public Templates Videos ubuntu@ubuntu2004:~$ readlink -e don.sh /home/ubuntu/test/flash.sh ubuntu@ubuntu2004:~$ ===== shell function parameter ===== run.sh #!/bin/bash Test1(){ echo "Test1 parameter1 $1" echo "Test1 parameter2 $2" echo "Test1 parameter5 $5" echo "Test1 parameter10 ${10}" echo "Test1 parameter11 ${11}" echo "number of parameter $#" echo "parameter string is $*" } Test1 1 2 3 4 5 6 7 8 9 10 11 echo $1 echo $2 result : run 9 8 Test1 parameter1 1 Test1 parameter2 2 Test1 parameter5 5 Test1 parameter10 10 Test1 parameter11 11 number of parameter 11 parameter string is 1 2 3 4 5 6 7 8 9 10 11 9 8 ============================================== f1() { local var="$1" echo "${!var}" } f1 1 f1 2 b Result : 1 --结果 1,相当于echo "${1}" b --结果 b, 相当于echo "${2}" ==== argv / argc ==== $!:Shell最后运行的后台Process的PID $#:總共傳進SHELL參數的個數 $$:Shell本身的PID $0:檔案本身的文件名 $?:獲取函數的返回值或上一個命令的退出狀態 $1:Shell中的第一个参数 $2:Shell中的第二个参数 $@:所有參數列表。如$@用" "括起来的情况、以"$1" 、"$2"、 … "$n" 的形式輸出所有參數。 $*:所有參數列表。如$*用" "括起来的情况、以"$1 $2 … $n" 的型式輸出所有參數,此選項參數可超過9個; 若不加" ",那么$*与$@的输出结果相同 =================================================================== #! /bin/bash # flash.sh nargs=$#; target_rootdev=${!nargs}; nargs=$(($nargs-1)); ext_target_board=${!nargs}; echo $target_rootdev echo $nargs echo $ext_target_board read -n1 -s -p "Press any key to continue..." #--------------------------------------------------- execution : sudo ./flash.sh jetson-agx-orin-devkit internal result : internal 1 jetson-agx-orin-devkit Press any key to continue... ===== Pause ===== ======================================================= read -n1 -s -p "Press any key to continue..." ============================================ #! /bin/bash function pause(){ read -n 1 -s -p "$*" INP } pause 'Press any key to continue...' ===== echo ===== ==== 照原樣輸出,不進行轉譯或取變量 ==== 這裡使用的是正常單引號 echo '"$test\' result : "$test\ ==== 顯示命令的結果 ==== 這裡使用反引號,而不是單引號,顯示將會是當前日期 反引號用於執行命令並將其輸出作為字串返回 echo `date` result : Thu 07 Mar 2024 10:07:37 PM EST ===== dmesg ===== dmesg [-cn][-s <緩衝區大小>] -c  顯示信息後,清除 ring buffer 中的内容。 -s <緩衝區大小>  預設置為 8196,剛好等於 ring buffer 的大小。 -n  設置記錄信息的層級。 將信息存成檔案 sudo dmesg > logfile ===== calculate programming time ===== #! /bin/bash beginTime=$(date "+%Y-%m-%d %H:%M:%S") echo "beginTime:" $beginTime # Your programming instruction sleep 12 endTime=$(date "+%Y-%m-%d %H:%M:%S") echo "endtime:" $endTime duration=$(($(date +%s -d "${endTime}")-$(date +%s -d "${beginTime}"))); echo "Programming time is :" $duration"s" ===== Supervisor ===== sudo su In console mode (ctrl + alt + t Terminal) sudo nautilus root ===== &, &&, | and || ===== & 如果在指令後面加上 & 符別, 即表示指令在背景執行, 例如 my-script.sh & && 用 “&&” 分開兩個指令, 即第一道指令執行成功後, 才會執行第二道指令, 例如 make && make install | 這是管線的符號, 即是將第一道指令的輸出, 作為第二道指令的輸入, 例如 ls | grep filename || 表示第一道指令執行失敗後, 才會執行第二道指令, 例如 cat filename || echo “fail” ===== find ===== # -type f 找檔案 # -type d 找目錄 # -type p 具名的 pipe(FIFO)。 # -type l 找連結檔 # 不加 -type 就是所有結果都會列出來 find ./ -name "*spi*" -type f # 把當下目錄有 "spi" 關鍵字檔名移動到 bar 資料夾 find ./ -name "*spi*" -type f | xargs -i mv {} bar # 找出單檔大於 600M/2G的檔案 find ./ -size +600M find ./ -size +2G ===== tar ===== #保留 "檔案擁有者" #壓縮目錄 cd ~/workspace/dev2725_002_mod02b sudo tar -czvpf ~/workspace/dev2725_002_mod03.tar.gz . #解壓到目錄 cd ~/workspace mkdir dev2725_002_mod03 sudo tar -xzvpf ~/workspace/dev2725_002_mod03.tar.gz -C ~/workspace/dev2725_002_mod03 ===== chown ===== ex: sudo chown -vR kk3985:kk3985 ~/workspace/dev2725_002_mod03 ===== chmod ===== ex: chmod -vR 777 ~/workspace/dev2725_002_mod03 ===== vmware ===== #Install vmware tools sudo apt-get update sudo apt-get install open-vm-tools #shrink vmware image size sudo vmware-toolbox-cmd disk shrink / ===== USB Storage Size ===== sudo lsblk -p -d | grep sd