for i in {1..100..2}
# 字符串
for day in {Mon Tue Wed Thu Fri Sat Sun}
# 命令
for file in $(ls)
for ((expression1;expression2;expression3))
for (( i=1;i<5;i++))
array=(Monday Tuesday Wednesday Thursday Friday Saturday Sunday)
#通过 for 循环遍历数组元素
for day in ${array[*]}
until expression
do
...
done
while expression
do
...
done
function_name ()
function function_name ()
[hello@Git shell]$ bash test.sh -a hello
this is -a the arg is ! hello
[hello@Git shell]$ more test.sh
#!/bin/bash
# 这个opt保存了我们存到OPTARG里面的变量名
while getopts "a:" opt; do
case $opt in
a)
echo "this is -a the arg is ! $OPTARG"
;;
\?)
echo "Invalid option: -$OPTARG"
;;
esac
done
getopts一共有两个参数,第一个是-a这样的选项,第二个参数是 hello这样的参数。
选项之间可以通过冒号:进行分隔,也可以直接相连接,:表示选项后面必须带有参数,如果没有可以不加实际值进行传递
getopts ahfvc: option表明选项a、h、f、v可以不加实际值进行传递,而选项c必须取值,值保存在$OPTARG
var=name
name=John
引用name的两种方式
${name}
${!var}
#! /bin/bash
#定义函数
func()
{
echo "number of elements is $#."
while test $# -gt 0
do
echo "$1"
shift
done
}
#定义数组
a=(a b "c d" e)
#调用函数,注意这里的引号,它将c和d看成一个
func "${a[@]}"
输出
number of elements is 4.
a
b
c d
e
# 注意,点号和filename之间有个空格,filename可以使绝对或相对路径
. filename
# 直接使用下标,这种定义了1个,那么数组长度就是1
array[1]=one
# 使用declare -a
declare -a array
array[0]=1
# 通过元素值集合定义数组
array=(1 2 3 4 5 6 7 8)
# 通过键值对定义数组
array=([1]=one [4]=four)
array=(1 2 3 4 5)
# 下面返回1
echo "${array}"
# 复制
newarray=("${array[@]}")
# 连接
("$array1[@]}" "${array2[@]}")
content=(`cat "demo.txt"`)
#通过循环输出数组内容
for s in "${content[@]}"
do
echo "$s"
done
sed [options] commands inputfile
sed [options] -f script inputfile
./scrpt inputfile
然后脚本第一行如下
#! /bin/sed
sed -n '1,3p' students.txt
address {
command1
command2
command3
…
}
sed -f script
# actions 前面的左大括号需与 pattern 位于同一行中
awk pattern { actions }
pattern 和 actions 都是可选的,但是两者必须保证至少有一个。如果省略匹配模式 pattern,
则表示对所有的文本行执行 actions 所表示的操作;如果省略 actions,则表示将匹配成功的
行输出到屏幕
# 注意单引号,'program-text'是要执行的命令
awk 'program-text' datafile
# 注意开头
#! /bin/awk -f
# awk 脚本中不能含有除 awk 语句之外的其他命令或者语句,例如 Shell 命令等
awk -f program-file file ..`
#打印第 2 列的成绩超过 80 的行
result='awk '$2 > 80 { print }' scores.txt'
#输出以字符 T 开头的行
result='awk '/^T/ { print }' scores.txt'
…等等
命令输出文本echo
文本的格式化输出
文本排序的核心命令是sort
# [n]可以省略,n表述文件描述符,默认是1,注意,1和>没空格
cmd [n]> file
cmd 表示 Shell 命令,大于号>为重定向操作符,file 表示重定向的目标文件(可存在也可不存在,如果追加用>>)
9. 我们可以将标准错误和标准输出同时重定向
ls -lz &> filelist
[root@linux chapter12]# :> errmsg
{ cmd1;cmd2;...; } [n]> file
cmd < file
grep Bae > demo.txt < students.txt
[root@linux ~]# cat << eof
> This is a test file.
> There are two lines.
> eof
This is a test file.
There are two lines.
这里的eof是代表结束,可以用其它的标志,但是不能还有空格和制表符
15. 重定向操作符只对当前命令有效,使用 exec 命令可以永久性地重定向,它可以让重定向对当前 Shell 进程中的所有命令有效
[mozhiyan@localhost ~]$ echo "重定向未发生"
重定向未发生
# 标准输出重定向到log.txt,那么以后的标准输出都到了log.txt
[mozhiyan@localhost ~]$ exec >log.txt
[mozhiyan@localhost ~]$ echo "c.biancheng.net"
[mozhiyan@localhost ~]$ echo "蔡彬的博客"
# 恢复标准输出到显示器,因为2也是到显示器,这样1也到显示器了,一切OK
[mozhiyan@localhost ~]$ exec 1>&2
[mozhiyan@localhost ~]$ echo "重定向已恢复"
重定向已恢复
[mozhiyan@localhost ~]$ cat log.txt
c.biancheng.net
蔡彬的博客
echo $SHLVL
[root@linux chapter13]# . ./ex13-1.sh
这样在脚本里边就可以改变SHELL的路径了,使用圆点或者source命令使被调用脚本在当前SHELL进程中执行
(command1;command2;command3;...)
[root@linux chapter13]# man ls | grep long | more
trap [[arg] sigspec ...]
trap 'command' signal
我们可以使用它来在命令出错,或者函数返回非0时,结合ERR定义一个函数来输出错误
tee 主要是用在管道调试,tee 命令会从标准输入读取数据,将其内容输出到标准输出设备,同时又可将内容保存成文件
调试钩子
就是一个全局变量,来控制调试开关