- 在shell中,
#
代表注释 - 执行
chmod +x ./sh_demo.sh
,./sh_demo.sh
可直接运行,不再需要sh ./sh_demo.sh
这种写法 - 变量和值之间的=号不能有空格
name="siri"
age=8
- 使用
readonly
修饰只读变量
name="siri"
readonly name
- 使用
unset
删除变量
unset name
6.使用$
取变量
${name}
7.sh脚本的第0个参数为脚本的名称
fileName=${0}
name=${1}
age=${2}
sex=${3}
echo "名称为:$name 年龄为:$age 性别为:$sex"
运行: ./sh_demo.sh n a s
输出: 名称为:n 年龄为:a 性别为:s
8.$?
表示上一条命令是否执行成功.
返回值为0:表示命令成功
返回值为1:表示命令执行结果
返回值为2:表示命令执行状态返回码
9.参数相关
$# 参数个数
$* 参数列表 注意:把所有参数组合成一个字符串
$@ 参数列表 注意:依次把所有的参数输出,不会组合成字符串
$$ 获取当前shell进程ID
10.使用#
获取字符串长度
name="siri"
echo ${#name}
输出:4
11.使用:
字符串截取,从第1位开始截取2个字符
name="siri"
echo ${name:1:2}
输出:ir
12.打印数组的所有元素
arr=("1" "2" "3" "4")
echo ${arr[@]}
输出:1 2 3 4
13.打印数组的长度
arr=("1" "2" "3" "4")
echo ${#arr[@]}
输出:4
14.算数运算符,需要用expr
,不能直接加
加减法:
a=1
b=2
c=`expr $a + $b`
echo $c
打印:3
乘法:需要加\
a=3
b=5
c=`expr $a \* $b`
echo $c
打印:15
除法:
a=15
b=5
c=`expr $a / $b`
echo $c
打印:3
取余:
a=14
b=5
c=`expr $a % $b`
echo $c
打印:4
- 逻辑运算符
&& ||
,中括号[]
中间一定要有空格
a=1
b=5
if [ $a -lt 2 ] && [ $b -eq 6 ]
then
echo "成立"
else
echo "不成立"
fi
打印:不成立
- 使用
break
跳出循环
*break 1
代表退出1层循环, 默认为1
*break 2
代表退出2层循环 - 逐行读取文件
cat a.txt | while read line
do
echo "${line)"
done
- print的使用
print
和echo
都是用来输出内容的,区别在于echo
为标准输出,print
为自定义输出.
printf "%-10s %-.4f \n" siri 3.333
打印:siri 3.3330
解释:%为占位符,-为左对齐,10代表长度,s代表字符串,.4代表小数点后四位
- 在默认的情况下,wc将计算指定文件的行数、字数,以及字节数。
wc sh_demo.sh
输出:13 24 110 sh_demo.sh
- 重定向
<
输入重定向
<<
创建文件
>
输出重定向,会替换
>>
不会替换,只会追加内容 - 管道的使用
echo "1+1" | bc
打印:2
解释:将"1+1"这个式子放到bc(一个计算器)里面执行
- 将控制台的错误信息输出到文件
cd 不存在的路径 2 > error.txt
解释:加个数字 2 就好了,2 代表异常
cd 存在的的路径 不存在的路径 2> error.txt > right.txt
解释:将错误的信息和正确的信息输出到**不同**的文件
cd 存在的的路径 不存在的路径 &> errorAndRight.txt
解释:将错误的信息和正确的信息输出到**同一个**文件
- 临时重定向
file.sh
{
echo "hello" >&2
echo "world"
}
执行sh file.sh > error.txt,
发现error.txt中只有hello,------因为使用 >&2 将 "hello"标记为异常了
world则在控制台输出.
- 使用
exec
永久重定向
- 保存数据
file.sh
{
exec 1> output.txt
echo "hello"
echo "world"
}
执行sh file.sh,发现所有的内容都写到output.txt里面了.
保存错误信息
file.sh
{
exec 1> output.txt
echo "hello"
echo "world"
exec 2> error.txt
echo "find error" >&2
}
执行sh file.sh,发现"hello" "world"写到output.txt里面了.
"find error"写到error.txt里面了.
- 使用
exec 0 < input.txt
来重定向输入
- 0表示系统默认标准输入
- 1表示系统默认标准输出
- 2表示错误
- 大于等于3 则为自定义
exec 666> output.txt
echo "hello"
echo "world" >&666
echo "yes"
结果:打印了 "hello"和"yes",而"world"则输出到了output.txt.
- 恢复重定向
exec 3>&1
exec 1> output.txt
echo "hello"
exec 1>&3
echo "world"
解释:exec 3>&1将原来的 exec 3 替换为 exec 1,"hello"出现在output.txt里面.
exec 1>&3将exec 1 替换为 exec 3,所以"world"不会出现在output.txt里面.
- 关闭文件描述符,就不能再写入了
exec 3>&-
- /dev/null路径,帮助我们不用在控制台打印内容,并且自动清空内容
cat a.txt > /dev/null
没有输出, /dev/null也没有值
或者
cat /dev/null > a.txt
这样可以清空a.txt
- 创建临时文件
mktemp a.XXXXXX
解释:本地随机生成生成一个临时文件(必须大写的X)
mktemp -t a.XXXXXX
输出:/var/folders/40/gl3_xjt576vg008mqrpdqzdh0000gn/T/a.XXXXXX.hOEHe1td
解释:生成一个系统的临时目录
- 创建临时目录
mktemp -d a.XXXXXX
网友评论