SHELL基础知识点整理
程序员文章站
2024-02-19 14:52:40
...
SHELL
一、基本概念:
1. #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
2. echo命令用于向窗口输出文本
3. chmod +x ./脚本名.sh # 使脚本具有执行权限
二、Shell变量
1.定义变量时,变量名不加美元符号,变量名和等号之间不能有空格
命名规则和其他语言的语法一致
2.使用变量–使用定义过的变量只需要在变量名之前加美元符号即可
2.1 变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界
3.只读变量
使用readonly命令可以将变量定义为只读变量,只读变量的值是不可改变的
#!/bin/bash
url="www.baidu.com"
readonly url
url="www.baidu.com"
process result:
/bin/sh: NAME: This variable is readonly.
4.删除变量:unset
变量被删除后不能再次使用且不能删除只读变量
#!/bin/bash
#只读变量
url="www.baidu.com"
readonly url
url="www.baidu.com"
process result:
/bin/sh: NAME: This variable is readonly.
#删除变量
myurl="www.baidu.com"
unset myurl
echo $myurl
#单引号和双引号的使用
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
5.shell字符串
5.1单引号–单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号子串中不能出现单独的一个单引号,但是可以成对出现,作为字符串的拼接使用
5.2双引号可以有变量,且可以出现转义字符;
5.3获取字符串长度
5.4提取子字符串
5.5查找子字符串
#!/bin/shell
#获取字符串长度
string="abcd"
echo ${#string} #输出 4
#提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
#查找子字符串
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
6.数组
#!/bin/bash
#读取数组
array_name=(1 33 44 55 66)
valuen=${array_name[n]}
echo ${array_name[@]} #@符号可以获取数组中所有元素
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
#这个是注释也是单行注释
:<<!
这是多行注释
!
三、传递参数
-
传递参数的几个特殊字符
参数处理 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 [email protected] 与 ∗ 相 同 , 但 是 使 用 时 加 引 号 , 并 在 引 号 中 返 回 每 个 参 数 。 如 " *相同,但是使用时加引号,并在引号中返回每个参数。 如" ∗相同,但是使用时加引号,并在引号中返回每个参数。如"@“用「”」括起来的情况、以"$1" “ 2 " … " 2" … " 2"…"n” 的形式输出所有参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 -
实际代码
#!/bin/bash # author:菜鸟教程 # url:www.runoob.com echo "Shell 传递参数实例!"; echo "第一个参数为:$1"; echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*"; #区分 $* and [email protected] echo "-- \$* 演示 ---" for i in "$*"; do echo $i done echo "-- \[email protected] 演示 ---" for i in "[email protected]"; do echo $i done
四、基本运算符
-
shell数组可以存放多个值,数组元素的下标由0开始的,且元素之间使用空格符号分割
-
例如,两个数相加(注意使用的是反引号 *`* 而不是单引号 *’*):
-
算术题运算符
运算符 说明 举例 + 加法 expr $a + $b
结果为 30。- 减法 expr $a - $b
结果为 -10。* 乘法 expr $a \* $b
结果为 200。/ 除法 expr $b / $a
结果为 2。% 取余 expr $b % $a
结果为 0。= 赋值 a=$b 将把变量 b 的值赋给 a。 == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。 != 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。 -
关系运算符
运算符 说明 举例 -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。 -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。 -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。 -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。 -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。 -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。 -
布尔运算符
运算符 说明 举例 ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。 -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。 -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。 -
逻辑运算符
运算符 说明 举例 && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true -
字符串运算符
运算符 说明 举例 = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。 != 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。 -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。 -n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。 $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。 -
文件测试运算符
操作符 说明 举例 -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。 -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。 -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。 -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。 -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。 -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。 -
相关代码
#!/bin/bash val=`expr 2 + 2` echo "两数之和为 : $val" #乘号(*)前边必须加反斜杠(\)才能实现乘法运算; value= `expr $a \* $b` echo "$value" a=10 b=20 #关系运算符 if [ $a -eq $b ] then echo "a equal b" else echo "a not equal b" fi #布尔运算符 if [ $a != $b ] then echo " a not euqal b" else echo "a equal b" fi #逻辑运算符 if [[ $a -lt 100 && $b -gt 100 ]] then echo "返回true" else echo "返回false" fi #字符串运算符 aa="abc bb="abb" if [ $aa ] then echo "字符串不为空" else echo "字符串为空" fi if [ -z $a ] then echo "字符串长度是否为0" else echo "字符串长度不为0" fi #文件测试运算符 file="/var/www/runoob/test.sh" if [ -r $file ] then echo "文件可读" else echo "文件不可读" fi if [ -w $file ] then echo "文件可写" else echo "文件不可写" fi
五、shell echo命令
-
echo command use to input string
#显示普通字符串 echo "this is a string" #显示转义字符串 echo "\"it is a test"\" #显示变量 #!/bin/bash read name echo "$name it is a test" #显示换行 echo -e "ok! \n" #-e开启转义 echo "显示换行" #显示不换行 echo -e "OK! \c" # -e 开启转义 \c 不换行 echo "It is a test" #显示结果定向文件 echo "It is a test" > myfile #原样输出字符串,不进行转义或者去变量 echo '$name\"' #显示命令执行结果 echo `date` #结果是显示当前日期
六、Shell printf 命令
-
printf 命令的语法:printf format-string [arguments…]
-
参数说明:
- format-string: 为格式控制字符串
- arguments: 为参数列表。
-
参数说明:
-
printf 的转义序列
序列 说明 \a 警告字符,通常为ASCII的BEL字符 \b 后退 \c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略 \f 换页(formfeed) \n 换行 \r 回车(Carriage return) \t 水平制表符 \v 垂直制表符 \ 一个字面上的反斜杠字符 \ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效 \0ddd 表示1到3位的八进制值字符
七、Shell 循环控制
-
if 语句
if condition then command1 command2 fi
-
if else 语句
if condition then command1 elif condition2 then command2 else command3 fi
-
if else - if else语句
if condition1 then command1 elif condition2 then command2 else commandN fi
-
for loop
for var in item1 item2.... do command1 command2 done
-
while 语句
while condition do command done
#!/bin/bash
#流程控制
#适用于终端命令提示符
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a大于b"
elif [ $a -lt $b ]
then
echo "a小于b"
else
echo "没有符合条件的"
fi
echo "==================="
#结合test的用法
if test $[num1] -eq $[num2]
then
echo "两个数字相等!"
else
echo "两个数字不相等!"
fi
#forloop
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
for loop in 1 2 3 4 5
do
echo "the value is:$loop"
done
#顺序输出字符串中的字符
for str in this is string
do
echo $str
done
#while语句--循环用于不断执行系列命令
int =1
while(( $int<=5 ))
do
echo $int
let "int++"
done
echo -n '输入你最喜欢的网站名:'
while read films
do
echo "yeah! $films is a good website"
done
#case easc
echo '输入1到4之间的数字:'
echo '你输入的数字为:'
read num
case $num in
1) echo '这是1'
;;
2) echo '这是2'
;;
3) echo '这是3'
;;
4) echo '这是4'
;;
*) echo '你没有输入1到4之间的数字'
;;
esac
site="runoob"
case "$site" in
"runoob") echo "菜鸟教程"
;;
"google") echo "Google 搜索"
;;
"taobao") echo "淘宝网"
;;
esac
#continue&break
while :
do
echo -n "输入1-5之间的数字"
read num
case $num in
1|2|3|4|5) echo "输入数字为$num!"
;;
*) echo "你输入的数字不是1到5之间的游戏结束"
break
;;
esac
done
shell函数
-
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
-
定义一个带有return语句的函数
-
函数参数:调用函数时可以向其传递参数,在函数体内部可以通过$n形式来获取参数的值
注意事项:
参数处理 说明 $# 传递到脚本或函数的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 [email protected] 与$*相同,但是使用时加引号,并在引号中返回每个参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
相关代码:
#!/bin/bash
demoFun(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
#带有return语句的函数
func_return(){
echo "这个函数会对输入的两个数字进行相加运算"
echo "输入第一个数字"
read num
echo "输入第二个数字"
read another_num
echo "两个数字分别为 $num and $another_num !"
return $($num+$another_num)
}
func_return
echo "输入两个数字之和为$? !"
# 函数参数
#在shel中调用函数时可以向其传递参数 ,在函数体内部,通过$n的形式来获取参数的值
param_func(){
echo "第一个参数为$1"
echo "第二个参数为$2"
echo "第三个参数为$3"
echo "参数总个数为 $# 个!"
echo "作为一个字符串输出所有参数 $* "
}
param_func 4 5 6