使用者工具

網站工具


linux_shell_instruction

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 <file> 檔名是否存在
-f <file> 檔名是否存在且為檔案
-d <file> 檔名是否存在且為目錄
-x <file> 檔名是否存在且可執行
-r <file> 檔名是否存在且可讀取
-w <file> 檔名是否存在且可寫入
-L <file> 是否為軟連結
-S <file> 檔名是否存在且為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

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
linux_shell_instruction.txt · 上一次變更: 2024/08/08 18:19 由 don