想到哪兒寫到哪兒系列(經常犯錯的知識點)

概述

可以說,以下大部分知識點都是本人經過無數次踩雷o(╥﹏╥)o 之後進行的一些些總結了。

測試腳本相關信息

[root@myhost yuki]# pwd
/yuki
[root@myhost yuki]# ll
total 4
-rwxr-xr-x 1 root root 36 Dec  6 09:35 test.sh
1. 在腳本中獲取當前執行的腳本名稱
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

echo $0
[root@myhost yuki]# sh /yuki/test.sh
/yuki/test.sh
[root@myhost yuki]# ./test.sh 
./test.sh
2. 如何在命令行向腳本傳參?
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

echo $1 
echo $2
[root@myhost yuki]# sh /yuki/test.sh   ac  bd
ac
bd
3. 如何計算傳遞進來的參數的個數?
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

echo $#
[root@myhost yuki]# sh /yuki/test.sh   ac  bd
2

######################################################################

[root@myhost yuki]# cat  /yuki/test.sh 
#!/bin/sh

echo $#
[root@myhost yuki]# sh  /yuki/test.sh {a..z}
26
4. 獲取傳遞進來所有參數的值(把傳進來的所有參數當成一個整體,即當成一個字符串)
[root@myhost yuki]# cat  /yuki/test.sh 
#!/bin/sh

echo $*
[root@myhost yuki]# sh  /yuki/test.sh {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

#不推薦使用
5. 獲取傳遞進來所有參數的值(傳進來的所有參數還是單獨的個體)
[root@myhost yuki]# cat  /yuki/test.sh 
#!/bin/sh

echo $@
[root@myhost yuki]# sh  /yuki/test.sh {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

#推薦使用,這是將參數傳遞給其他程序的最佳方式,因爲它會保留內嵌在每個參數裏面的任何空白
6. 如何查看上一行命令/上個一腳本是否執行成功?
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

echo $#

echo $?
[root@myhost yuki]# sh /yuki/test.sh   ac  bd
2
0
7. 查看文本最後n行
tail -n  /yuki/test.sh
8. 查看文本最前n行
head -n  /yuki/test.sh
9. 獲取文件每一行的第n個元素的值
awk '{print $n}' /yuki/test.sh

cat /yuki/test.sh | awk '{print $n}' 
10. 假設文件中的每一行的第一個元素的值是"shell",如何獲取這一行的第n個元素的值?
awk '{ if ($1 == "shell") print $n}'  /yuki/test.sh

cat /yuki/test.sh | awk '{ if ($1 == "shell") print $n}'
11. 如何對自己的shell腳本進行調試?
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

echo $#

echo $?

######################################################################
[root@myhost yuki]# sh /yuki/test.sh  a1 b2
2
0

######################################################################
[root@myhost yuki]# sh  -x /yuki/test.sh  a1 b2
+ echo 2
2
+ echo 0
0

######################################################################
[root@myhost yuki]# sh  -v /yuki/test.sh  a1 b2
#!/bin/sh

echo $#
2

echo $?
0

######################################################################
[root@myhost yuki]# sh  -xv /yuki/test.sh  a1 b2
#!/bin/sh

echo $#
+ echo 2
2

echo $?
+ echo 0
0

12. shell腳本中如何聲明變量,這裏強調格式(賦值等號前後是否有空格)

#格式1:賦值等號後有空格
[root@myhost yuki]# cat  /yuki/test.sh 
#!/bin/sh

v1= "hello"

echo ${v1}
[root@myhost yuki]# sh  /yuki/test.sh 
/yuki/test.sh: line 3: hello: command not found


#格式2:賦值等號前有空格
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1 ="hello"

echo ${v1}
[root@myhost yuki]# sh  /yuki/test.sh 
/yuki/test.sh: line 3: v1: command not found


#格式3:賦值等號前後都有空格
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1 = "hello"

echo ${v1}
[root@myhost yuki]# sh  /yuki/test.sh 
/yuki/test.sh: line 3: v1: command not found

#格式4:賦值等號前後都沒有空格
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1="hello"

echo ${v1}
[root@myhost yuki]# sh  /yuki/test.sh 
hello

###結論:shell中給變量賦值時賦值等號前後都不能有空格!!!
13. 如何連接兩個字符串?
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1="hello"
v2=",world"

echo ${v1}${v2}
[root@myhost yuki]# sh  /yuki/test.sh 
hello,world

14. 如何進行兩個整數相加?
######################################################################

[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9
echo ${v1}+${v2}
[root@myhost yuki]# sh  /yuki/test.sh 
3+9
######################################################################

[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9
v3=v1+v2
echo ${v3}
[root@myhost yuki]# sh  /yuki/test.sh 
v1+v2

############### 方法1:let命令 ###########################################
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9
let v3=v1+v2
echo ${v3}
[root@myhost yuki]# sh  /yuki/test.sh 
12


######################################################################
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9
v3=($v1+$v2)
echo $v3
[root@myhost yuki]# sh  /yuki/test.sh 
3+9

################# 方法2:兩個小括號 ######################################

[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9
echo $(($v1+$v2))
v3=($v1+$v2)
echo $(($v3))
[root@myhost yuki]# sh  /yuki/test.sh 
12
12

################# 方法3:一箇中括號 ######################################
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9
v3=$v1+$v2
echo $[v3]
echo $[$v1+$v2]
[root@myhost yuki]# sh /yuki/test.sh 
12
12

############### 方法4:expr命令 ##########################################
[root@myhost yuki]# cat  /yuki/test.sh 
#!/bin/sh

echo "#用expr命令可以直接運算並打印出結果,而不再需要echo命令進行打印"

echo "####錯誤的格式(因爲expr表達式中的運算符前後都需要空格)"
v1=3
v2=9
expr $v1+$v2 

echo "####修改之後能夠計算出正確的結果"
v1=3
v2=9
expr $v1 + $v2
v3=`expr $v1 + $v2`
echo $v3

[root@myhost yuki]# sh /yuki/test.sh
 
#用expr命令可以直接運算並打印出結果,而不再需要echo命令進行打印
####錯誤的格式(因爲expr表達式中的運算符前後都需要空格)
3+9

####修改之後能夠計算出正確的結果
12
12

############### 方法5:管道+bc命令 #######################################
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9

echo $v1+$v2 | bc

v3=$v1+$v2
echo $v3 | bc
[root@myhost yuki]# sh /yuki/test.sh 
12
12

############### 方法6:awk命令 #########################################
[root@myhost yuki]# cat /yuki/test.sh 
#!/bin/sh

v1=3
v2=9

awk 'BEGIN{print '"$v1"'+'"$v2"'}'
awk 'BEGIN{print '$v1'+'$v2'}' 
#注意:運算符前後、中括號前後都沒有空格

[root@myhost yuki]# sh /yuki/test.sh 
12
12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章