shell变量
- 变量类型:
- 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 - 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 - shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
- 局部变量
- 定义一个变量
name="Micol"
变量名和“=“之间不能有空格
- 使用变量
echo $name
或者
echo ${name}
- 更改变量的值
name="Json"
- 设置为只读变量
readonly name
- 删除变量
unset name
只读变量不能删除
字符串
字符串可以用单引号或者双引号,但是单引号中不能使用变量,也不能使用单引号,总之单引号里面是什么样的输出就是什么样的。
建议使用双引号
- 拼接字符串
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
- 获取字符串长度
str="how are you!!!"
echo ${#str}
- 提取字符串
str="how are you!!!"
echo ${str:1:7}
- 查找子字符串
查找字符 "i 或 s" 的位置:
string="runoob is a great company"
echo `expr index "$string" is` # 输出 8
注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦。
shell数组
shell不支持多维数组
- 定义数组
数组名=(值1 值2 ... 值n)
或者
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
- 读取数组
${数组名[下标]}
例如
valuen=${array_name[n]}
- 获取数组长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
shell注释
用“#”表示注释符号
不支持多行注释
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
shell传递参数
在运行shell命令时,可以同时传入参数。
在程序中,$1,$2,$3表示第一,第二,第三个参数;
$0:表示shell名。
$#:传递到脚本的参数个数
在test.sh中写入:
#!/bin/sh
echo $0
echo $1
echo $2
更改为可执行程序
chmod +x test.sh
运行
./test.sh 1 2 3
基本运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
如:
#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"
注意:相乘时需要在“*”前加“\”,如“2 * 2”
- 关系运算符
- 布尔运算符
- 逻辑运算符
- 字符串运算符
- 文件测试运算符
- 文件测试运算符
echo
- 输出字符串
echo "that is good idea"
或者:省略“”“
echo that is good idea
- 读入输入数据
read name
echo "$name is read"
- 显示换行
echo -e "OK! \n" # -e 开启转义
echo "It it a test"
- 显示不换行
#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
- 显示结果定向至文件
echo "It is a test" > myfile
- 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
输出结果:
$name\"
- 显示命令执行结果
echo `date`
注意: 这里使用的是反引号 `, 而不是单引号 '。
结果将显示当前日期
Thu Jul 24 10:08:46 CST 2014
printf()
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
输出:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。