. 数组相关操作
. shell与文件
. shell输入与输出重定向
. Here Document
. shell与信号
. shell文件包含
. shell运算符
# 数组:数组中可存放多个值(只支持一维)
# 初始化时不需要定义数组大小,并且没有限定数组的大小
# 下标从0开始,下标可以是整数或算术表达式,其值大于等于0
# shell数组用括号表示,元素用空格分割开,可以不使用连续的下标
# 并且下标的范围没有限制
# 语法格式:arr_name=(value1 value2...valuen)
# 或者:
# arr_name[0]=""
# arr_name[1]=""
# arr_name[10]=""
# ...
# 读取数组指定元素值的一般格式为:${arr_name[index]}
arr=(1 a 3.14 'A' "string")
echo "0:${arr[0]}"
echo "1:${arr[1]}"
echo "2:${arr[2]}"
echo "3:${arr[3]}"
echo "4:${arr[4]}"
# 获取数组中的所有元素
arr=(1 a 3.14 'A' "string")
echo ${arr[@]}
echo ${arr[*]}
# 获取数组的长度
arr=(1 a 3.14 'A' "string")
echo ${#arr[@]}
echo ${#arr[*]}
# 遍历数组
# 方式1:
arr=(1 a 3.14 'A' "string")
for (( i=0;i <${#arr[@]};i++ ))
do
echo "$i -> ${arr[i]}"
done
# 方式2:
arr=(1 a 3.14 'A' "string")
for i in ${arr[@]}
do
echo $i
done
# 我们在前面也说过shell中的数组下标可以是不连续的
# 假如我们在数组中添加一个元素arr[7],没有下标为5,6的元素
# 这个时候我们使用方式1是是不会访问到下标为7的元素的
# 解决办法:推荐使用方式2
# shell与文件:大多数UNIX系统命令从我们的终端接受输入
# 并将所产生的输出发送回我们的终端。一个命令通常从一个
# 叫标准输入的地方读取输入,默认情况下,这恰好是我们的终端
# 同样,一个命令通常将其输出写入到标准输出,默认情况下
# 这也会是我们的终端
# shell输出重定向:
echo "hello world" > file
for i in {1..3}
do
echo "haha $i"
done > file
# shell追加重定向
echo "hello world" > file
for i in {1..3}
do
echo "haha $i"
done >> file
# shell输入重定向
# 只能读文件中的一行
read line < file
echo $line
# 可按行读取整个文件的内容
while read line
do
echo $line
done < file
# 给每行添加一个字符串,并且备份到另外一个文件中
while read line
do
echo 'YES '$line
done < file >> file2
# 默认情况下。command > file将stdout重定向到file
# command < file将stdin重定向到file
# stderr重定向到file:
# 2表示标准错误文件(stderr)
find aaaaa 2> file # 重定向
find bbbbb 2>> file # 追加重定向
# 注意这里的 2> 是一个整体,2和>之间不能有空格
# 如果要将stdout和stderr合并后重定向到file,可以这样写:
# command >> file 2>&1
find / -name shell2.sh > out 2>&1
# Here Document:是一种特殊的重定向方式
# 用来将输入重定向到一个交互式shell脚本或程序,基本形式:
# command << delimiter
# document
# delimiter
# 作用:将两个delimiter之间的内容(document)作为输入传递给command
# 结尾的delimiter一定要顶格写,前后不能有任何字符,包括空格和tab
# 开始的delimiter前后的空格会被忽略掉
# 统计EOF之间有多少行string
wc -l <<EOF
aaaa
bbbb
cccc
EOF
# 使用Here Document生成Makefile文件
cat <<EOF > Makefile
test:test.c
gcc -o test test.c
.PHONY:clean
clean:
rm -f test
EOF
# /dev/null:如果希望执行某个命令,但又不希望
# 在屏幕上显示输出结果,可将结果重定向到/dev/null
# 该文件是一个特殊的文件,写入到他的内容都会被丢弃
# 不会从该文件中读到任何内容,但是有用的是会有禁止输出的效果
# 如果希望屏蔽stdout和stderr可以这样写:
find / -name shell2.sh > out 2>&1 > /dev/null
# shell与信号,常见处理方式如下:
# trap 'commands' signal-list:当脚本收到signal-list
# 清单列出的信号时,trap命令会执行引号中的命令
trap 'echo "hello"; ls' 3
while :
do
:
done
# trap signal-list:trap不指定任何命令,接受信号的默认操作
# 默认操作是结束进程的运行
# trap '' signal-list:trap命令指定一个空命令串,允许忽视信号
# shell文件包含:使用 . 和 source
. api.sh
source api.sh
read d1 d2
res=$(intAdd $d1 $d2)
echo $res
# 新建一个文件写以下函数
# function intAdd()
# {
# let data=$1+$2
# echo $data
# }
# shell运算符
# echo
# 显示字符串
echo "hello" # 可省略双引号
echo hello
# 显示换行
echo -e "hello! \nworld"
# 显示不换行
echo "hello!\c"
echo "world"
# printf:使用printf的脚本比使用echo的移植性好
# printf使用引用文本或空格分割的参数,外面可以在printf
# 中使用格式化字符串,还可以定制字符串的宽度,左右对齐方式等
# 默认printf不会像echo自动添加换行符,可手动添加\n
mystring='string'
myint=100
myfloat=3.14
printf "%s:%d:%f\n" $mystring $myint $myfloat
# 产生一个随机数
echo $RANDOM