====== 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
===== 增加 APP 權限到目前 USER中 =====
sudo adduser $USER libvirt // 增加 libvirt 權限,給目前使用者
sudo adduser $USER libvirt-qemu