截取語法
a="g8g8ffgg"
expr substr "$a" 1 8
矩陣定義
a=$(ifconfig "${1}" )
name=($a)
矩陣
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
echo $tyicmp
done
指令放在矩陣例子
cown=$(ifconfig | sed -n '/Link/{N;s/\(^[^ ]*\).*inet addr:\([0-9.]*\).*/\1 \2/p}' | wc -l)
D1=($cown)
all=$(ifconfig | sed -n '/Link/{N;s/\(^[^ ]*\).*inet addr:\([0-9.]*\).*/\1 \2/p}' | awk '{print $1 }' | sed -n $i'p')
D2=($all)
D1 D2 為矩陣
取得單一字元
ifconfig eth0 |grep "HWaddr" | cut -c 1-1
抓有幾個網卡
ifconfig | sed -n '/Link/{N;s/\(^[^ ]*\).*inet addr:\([0-9.]*\).*/\1 \2/p}'
找IP位址shell
ifconfig | awk -F'[ :]+' '/Bcast/{print $4}'
ifconfig | awk -F'[ :]+' '/Mask/{print $4}'
判斷eth0位置
# 顯示文件中的第一行 (模擬「head -1」命令)
sed q
# 顯示文件中的最後10行 (模擬「tail」)
sed -e :a -e '$q;N;11,$D;ba'
# 顯示文件中的最後2行(模擬「tail -2」命令)
sed '$!N;$!D'
# 顯示文件中的最後一行(模擬「tail -1」)
sed '$!d' # 方法1
sed -n '$p' # 方法2
in internet
有同事問我怎麼在 Linux 中顯示出檔案中的某一行,像這樣的功能使用 sed 來做是非常簡單地就可以辦到了,由以下的簡單的範例來說明用法。
[sam@sever ~]$ cat testfile
12345
abcdefghijkl
678901234
mnopqrstuvwxyz
[sam@sever ~]$ sed -n '2p' testfile
abcdefghijkl
在 testfile 這個檔案裡有四行文字,接著使用 sed -n '2p' testfile 可以將第二行的內容顯示出來。如果要顯示別行,就將 2 改成該行號即可。
存指令為變數的方法
a=$(ifconfig | sed -n '/Link/{N;s/\(^[^ ]*\).*inet addr:\([0-9.]*\).*/\1 \2/p}' | awk '{print $1 }' | sed -n $i'p')
name=($a)
echo ${name[1]}
echo -n 不换行输出
$echo -n "123"
$echo "456"
最终输出
123456
而不是
123
456
echo -e 处理特殊字符
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
$echo -e "a\bdddd"
dddd
$echo -e "a\adddd" //输出同时会发出报警声音
adddd
$echo -e "a\ndddd" //自动换行
a
dddd
shell中计算除法,基本的方法有几种
t1=3
t2=6
1)expr
num=`expr $(($t1/$t2))`
num的结果为0,因为expr不支持浮点算法
2)bc
echo "scale=2;$t1/$t2"|bc
scale用来控制小数点后面保留的位数
3)awk
awk 'BEGIN{printf "%.2f%\n",('$t1'/'$t2')}'
awk 'BEGIN{printf "%.2f%\n",('$t1'/'$t2')*100}'
shell字元串比較判斷是否為數字
整數比較
-eq 等於,如:if [ "$a" -eq "$b" ]
-ne 不等於,如:if [ "$a" -ne "$b" ]
-gt 大於,如:if [ "$a" -gt "$b" ]
-ge 大於等於,如:if [ "$a" -ge "$b" ]
-lt 小於,如:if [ "$a" -lt "$b" ]
-le 小於等於,如:if [ "$a" -le "$b" ]
< 小於(需要雙括弧),如:(("$a" < "$b"))
<= 小於等於(需要雙括弧),如:(("$a" <= "$b"))
> 大於(需要雙括弧),如:(("$a" > "$b"))
>= 大於等於(需要雙括弧),如:(("$a" >= "$b"))
字元串比較
= 等於,如:if [ "$a" = "$b" ]
== 等於,如:if [ "$a" == "$b" ],與=等價
注意:==的功能在[[]]和[]中的行為是不同的,如下:
1 [[ $a == z* ]] # 如果$a以"z"開頭(模式匹配)那麼將為true
2 [[ $a == "z*" ]] # 如果$a等於z*(字元匹配),那麼結果為true
3
4 [ $a == z* ] # File globbing 和word splitting將會發生
5 [ "$a" == "z*" ] # 如果$a等於z*(字元匹配),那麼結果為true
一點解釋,關於File globbing是一種關於文件的速記法,比如"*.c"就是,再如~也是.
但是file globbing並不是嚴格的正則表達式,雖然絕大多數情況下結構比較像.
!= 不等於,如:if [ "$a" != "$b" ]
這個操作符將在[[]]結構中使用模式匹配.
< 小於,在ASCII字母順序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]結構中"<"需要被轉義.
> 大於,在ASCII字母順序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]結構中">"需要被轉義.
具體參考Example 26-11來查看這個操作符應用的例子.
-z 字元串為"null".就是長度為0.
-n 字元串不為"null"
注意:
使用-n在[]結構中測試必須要用""把變數引起來.使用一個未被""的字元串來使用! -z
或者就是未用""引用的字元串本身,放到[]結構中。雖然一般情況下可
以工作,但這是不安全的.習慣於使用""來測試字元串是一種好習慣.
awk '{print $2}' class.txt | grep '^[0-9.]' > res
–b 當file存在並且是塊文件時返回真
-c 當file存在並且是字元文件時返回真
-d 當pathname存在並且是一個目錄時返回真
-e 當pathname指定的文件或目錄存在時返回真
-f 當file存在並且是正規文件時返回真
-g 當由pathname指定的文件或目錄存在並且設置了SGID位時返回為真
-h 當file存在並且是符號鏈接文件時返回真,該選項在一些老系統上無效
-k 當由pathname指定的文件或目錄存在並且設置了「粘滯」位時返回真
-p 當file存在並且是命令管道時返回為真
-r 當由pathname指定的文件或目錄存在並且可讀時返回為真
-s 當file存在文件大小大於0時返回真
-u 當由pathname指定的文件或目錄存在並且設置了SUID位時返回真
-w 當由pathname指定的文件或目錄存在並且可執行時返回真。一個目錄為了它的內容被訪問必然是可執行的。
-o 當由pathname指定的文件或目錄存在並且被子當前進程的有效用戶ID所指定的用戶擁有時返回真。
case
#!/bin/ash
case $1 in
0 )
./A
;;
1 )
./A
;;
esac
if
c=$(grep "$1=" work2.txt)
echo "$c"
if [ "$c" != "" ]
then
echo "foud"
elif [ "$c" = "" ]
then
echo "not found"
fi
正確
if [ "${name[i]}" = "HWaddr" ]
then
echo "dddddddddddddddddddddddddddddddddddd"
fi
Bash shell 有提供一維陣列的功能
A[0]=1
A[1]=2
A[2]=3
echo "${A[0]} , ${A[1]} , ${A[2]}"
=======
上式也可以一次設定:
A=(1 2 3)
echo "${A[0]} , ${A[1]} , ${A[2]}"
結果是一樣的!
========
也可用字串當 陣列 的索引:
A["bash"]="Hello World"
echo ${A["bash"]}
結果出現 Hello World
待續0...0