shell的基础用法
-
shell变量
-
Shell 支持以下三种定义变量的方式:
- value=abc
- value=‘abc’
- value=“abc”
- (注意,赋值号=的周围不能有空格)
-
Shell 变量的命名规范
- 变量名由数字、字母、下划线组成
- 必须以字母或者下划线开头
- 不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)
-
使用变量
-
使用一个定义过的变量,只要在变量名前面加美元符号$即可
train="huoche" c="huoche" echo $c echo ${train}
-
变量名外面的花括号{ }是可选的
-
-
修改变量的值
c="huoche" echo $c c="qiche" echo $c
-
单引号和双引号的区别
-
以单引号’ '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景
-
以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。
a1="abc" a2="aaa:${a1}" a3='aaa:${a1}' echo $a2 echo $a3
-
-
将命令的结果赋值给变量
-
把命令用反引号`包围起来
-
把命令用$()包围起来
a1=`shell` a2=$(shell)
-
-
只读变量
-
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
a="asdfghhj" readonly a echo $a
-
-
删除变量
-
使用 unset 命令可以删除变量
-
unset 命令不能删除只读变量(没有任何输出)
a="asdfghhj" readonly a b="123456" echo $a echo $b unset b echo $b
-
-
-
Shell传递参数
-
向脚本传递参数,脚本内获取参数的格式为:$n。$0 为执行的文件名。
echo "$0" echo "$1" echo "$2" echo "$3" echo "$4" echo "$5" echo "$6"#终端传参 sh demo.sh 1 2 3 4 5 6
-
特殊字符处理参数说明
echo $# echo $* echo $@#终端传参 sh demo.sh 1 2 3 4 5 6
- $* 与 $@ 区别:
- 相同点:都是引用所有参数。
- 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
-
-
Shell字符串
-
三种形式的区别
-
由单引号’ '包围的字符串:
- 任何字符都会原样输出,在其中使用变量是无效的。
- 字符串中不能出现单引号,即使对单引号进行转义也不行。
-
由双引号" "包围的字符串:
- 如果其中包含了某个变量,那么该变量会被解析,而不是原样输出。
- 字符串中可以出现双引号,只要它被转义了就行。
-
不被引号包围的字符串
-
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
-
字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
n=14 s1=www.baidu.com$n s2="www\".baidu\".com $n" s3='www.baidu $n' echo $s1 echo $s2 echo $s3
-
-
-
获取字符串长度
-
获取字符串长度:${#字符串名称}
s3='www.baidu $n' echo ${#s3}
-
-
字符串拼接(连接、合并)
-
不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接
a1=www. a2=baidu echo $a1$a2 echo "$a1 $a2" echo $a1":"$a2 echo "$a1:$a2" echo "${a1}Script:${a2}index.html"
-
-
字符串截取
-
从指定位置开始截取
-
这种方式需要两个参数:指定起始位置,截取长度,才能确定要截取的字符串。
-
从字符串左边开始计数
url="https:www.guge.com" echo ${url:2:9} echo ${url:2}
-
从字符串右边开始计数。格式:${字符串:0-start : length}
url="https:www.guge.com" echo ${url:0-10:9} echo ${url:0-13}
-
-
从指定字符(子字符串)开始截取
-
使用 # 号截取右边字符
url="https:www.guge.com" echo ${url#*u} echo ${url#*uge} echo ${url#*:} echo ${url#http} #以上写法遇到第一个匹配的字符(子字符串)就结束了 echo ${url##*.} echo ${url#*guge.} 希望直到最后一个指定字符(子字符串)再匹配结束
-
使用 % 截取左边字符
url="https:www.guge.com" echo ${url%.*}#遇到最后一个匹配的字符(子字符串)就结束了 echo ${url%%.*}#遇到第一个匹配的字符(子字符串)就结束
-
-
-
-
-
Shell数组
-
创建一个简单的数组 my_array
my_array=(a b 'c' d)
-
读取数组
my_array=(a b 'c' d) echo "第一个元素:${my_array[0]}" echo "第二个元素:${my_array[1]}" echo "第三个元素:${my_array[2]}" echo "第四个元素:${my_array[3]}"
-
关联数组
declare -A site site["guge"]="www.guge.com" site["baidu"]="www.baidu.com" echo ${site["guge"]}
-
获取数组中的所有元素
my_array[0]=a my_array[1]=b my_array[2]=c my_array[3]=d echo ${my_array[@]} echo ${my_array[*]}
-
获取数组的长度
my_array[0]=a my_array[1]=b my_array[2]=c my_array[3]=d echo ${#my_array[@]} echo ${#my_array[*]}
-
-
Shell运算符
```m=10n=20echo `expr $m + $n`#使用命令必须有空格echo `expr $m - $n`echo `expr $m \* $n`echo `expr $m / $n`echo `expr $m % $n`echo `expr $m = $n`echo `expr $m == $n`echo `expr $m != $n`echo $(($m+$n))echo $(($m-$n))echo $(($m*$n))echo $(($m/$n))echo $(($m%$n))echo $(($m==$n))echo $(($m!=$n))```
```m=10n=20if [ $m -eq $n ];thenecho "m等于n"elseecho "m不等于n"fiif [ $m -ne $n ];thenecho "m不等于n"elseecho "m等于n"fiif [ $m -gt $n ];thenecho "m大于n"elseecho "m不大于n"fiif [ $m -lt $n ];thenecho "m小于n"elseecho "m不小于n"fiif [ $m -ge $n ];thenecho "m大于等于n"elseecho "m不大于等于n"fiif [ $m -le $n ];thenecho "m小于等于n"elseecho "m不小于等于n"fi```
-
布尔运算符
m=10 n=20 if [ $m != $n ]; thenecho "m不等于n" elseecho "m等于n" fiif [ $m -lt 20 -o $n -gt 100 ]; then echo "m小于20或n大于100" elseecho "no" fiif [ $m -lt 20 -o $n -gt 100 ]; then echo "m小于20且n大于100" elseecho "no" fi
-
逻辑运算符
```m=10n=20if [[ $m -lt 100 && $n -lt 100 ]];then echo "true"elseecho "false"fiif [[ $m -lt 100 || $n -lt 100 ]];then echo "true"elseecho "false"fi```
```n=10if [ -z $n ];then echo "true"elseecho "false"fiif [ -n "$n" ];then echo "true"elseecho "false"fiif [ $n ];then echo "true"elseecho "false"fi```
-
文件测试运算符
if [ $n ]; then echo "true" elseecho "false" fiif [ -d $n ]; then echo "true" elseecho "false" fiif [ -f $n ]; then echo "true" elseecho "false" fi if [ -e $n ]; then echo "true" elseecho "false" fi