1.变量的使用
1.1 变量的定义
Shell 支持以下三种定义变量的方式
bash
url=chadm
echo $url
name='chadm'
echo $name
author="chadm"
echo $author
# 打印变量有2种方式
echo $author
echo ${author}
# (())和let都只能使用整数
a=$((10+66)
echo $a
let b+=6
echo $b
注意,赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样
1.2 将命令的结果赋值给变量
bash
variable=`command`
variable=$(command)
1.3 获取输入参数
运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推
bash
#定义函数
function func(){
echo "Language: $1"
echo "URL: $2"
}
#调用函数
func shell "https://test"
特殊参数
- $0 当前脚本的文件名。
- $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是$2。
- $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。当被双引号""包含时,
- $@ 与 $* 稍有不同 $? 上个命令的退出状态,或函数的返回值,
- $$ 当前 Shell 进程 ID。对于 Shell
脚本,就是这些脚本所在的进程 ID。
2.字符串相关
2.1 获取字符串长度
使用命令: ${#string_name}
bash
str="hello world"
echo ${#str} // 输出结果是11
2.2 字符串拼接
在 Shell 中你不需要使用任何运算符,将两个字符串并排放在一起就能实现拼接
bash
name="Shell"
url="http://test"
str1=$name$url #中间不能有空格
str2="$name $url" #如果被双引号包围,那么中间可以有空格
str3=$name": "$url #中间可以出现别的字符串
str4="$name: $url" #这样写也可以
str5="${name}Script: ${url}index.html" #这个时候需要给变量名加上大括号
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
输出结果:
Shellhttp://test
Shell http://test
Shell: http://test
Shell: http://test
ShellScript: http://testindex.html
2.3 字符串截取
从左开始截取:${string: start :length}
string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length
是要截取的长度(省略的话表示直到字符串的末尾
从右开始截取:${string: 0-start :length}
同第 1) 种格式相比,第 2) 种格式仅仅多了0-,这是固定的写法,专门用来表示从字符串右边开始计数
示例:
bash
# 截取最后一位,都是输出o
name="hello"
echo ${name:4:1} # 从左边开始截取
echo ${name:0-1:1} # 从右边开始截取
总结:
- ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
- ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
- ${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
- ${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
- **${string#chars}* 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
- **${string##chars}* 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
- **${string%chars}* 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
- **${string%%chars}* 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符
3.数组的使用
在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔
bash
arr=(12 23 "hello" )
# 获取数组第一个元素
echo ${arr[0]}
# 获取所有元素
echo ${arr[*]}
echo ${arr[@]}
# 获取数组长度
echo ${#arr[*]}
echo ${#arr[@]}
# 数组拼接
arr2=(56 "world")
arr3=(${arr[*]} ${arr2[*]})
echo ${arr3[*]}
对应的输出结果
12
12 23 hello
12 23 hello
3
3
12 23 hello 56 world
4.逻辑流程控制
4.1 if/esle语句
最后必须以fi来闭合,fi 就是 if 倒过来拼写
bash
if condition
then
statement(s)
fi
或者
if condition; then
statement(s)
fi
针对整数的,使用(())
双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令
bash
a=1
b=2
if (( $a == $b ))
then
echo "a和b相等"
else
echo "a和b不相等"
fi
针对字符串
[[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立
bash
str1="1"
str2="2"
if [[ -z $str1 ]] || [[ -z $str2 ]] #不需要对变量名加双引号
then
echo "字符串不能为空"
elif [[ $str1 < $str2 ]] #不需要也不能对 < 进行转义
then
echo "str1 < str2"
else
echo "str1 >= str2"
fi
4.2 循环
break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环
while
bash
while ((i <= 10))
do
((sum += i))
((i++))
done
echo "The sum is: $sum"
switch
bash
printf "Input integer number: "
read num
case $num in
1)
echo "Monday"
;;
2)
echo "Tuesday"
;;
3)
echo "Wednesday"
;;
4)
echo "Thursday"
;;
5)
echo "Friday"
;;
6)
echo "Saturday"
;;
7)
echo "Sunday"
;;
*)
echo "error"
esac
for
bash
sum=0
for ((i=1; i<=10; i++))
do
((sum += i))
done
echo $sum
5.运算&判断
5.1 数字
bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
参数 说明
- -eq 等于则为真
- -ne 不等于则为真
- -gt 大于则为真
- -ge 大于等于则为真
- -lt 小于则为真
- -le 小于等于则为真
5.2 字符串
bash
num1="hello"
num2="world"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
参数说明
- = 等于则为真
- != 不相等则为真
- -z 字符串 字符串的长度为零则为真
- -n 字符串 字符串的长度不为零则为真
5.3 文件
bash
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
参数 说明
- -e 文件名 如果文件存在则为真
- -r 文件名 如果文件存在且可读则为真
- -w 文件名 如果文件存在且可写则为真
- -x 文件名 如果文件存在且可执行则为真
- -s 文件名 如果文件存在且至少有一个字符则为真
- -d 文件名 如果文件存在且为目录则为真
- -f 文件名 如果文件存在且为普通文件则为真
- -c 文件名 如果文件存在且为字符型特殊文件则为真
- -b 文件名 如果文件存在且为块特殊文件则为真
5.4 bool运算&逻辑运算
bool运算
- ! 非运算,表达式为 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