基本语法
Shell文件的开头
Shell的开头需要写成
#!/bin/bash
#!这个符号是表示,让系统去调用后面的的参数来解释执行该文本的程序
除此之外,还有下列可以用的解释器
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash
/usr/bin/screen
Shell进行注释
# 符号代表的是改行后面的内容注释
变量
如何定义变量
shell中进行变量的定义时,不需要对变量进行声明,可以直接赋值
应用变量时,用“ $” + 变量名即可访问变量的内容
注意:
赋值时,等号左右两边不可有空格。因为shell脚本的内容是由解释器进行解释运行的
如果等号进行了空格,便将对变量的赋值视为指令,造成错误
特殊变量
$0
相当于C语⾔言main函数的argv[0]$1、$2...
这些称为位置参数(Positional Parameter),相当于C语⾔言main函数 的argv[1]、argv[2]...$#
相当于C语⾔言main函数的argc - 1,注意这⾥里的#后⾯面不表⽰示注释$@
表⽰示参数列表"$1" "$2" ...,例如可以⽤用在for循环中的in后⾯面。$?
上⼀一条命令的Exit Status$$
当前Shell的进程号
定义数组
arr=( "hello" "world" "!!!" )
Arr[0]="hello"
Arr[1]="world"
Arr[2]="!!!"
echo ${arr[*]}
echo ${Arr[*]}
流程控制语句
if语句
if [ 10 -gt 20 ] #如果10大于20
echo "10 > 20" #打印这句话
else
echo "10 < 20"
fi
和C语言不同,if语句的判断需要加方括号
并且if和 ‘[’ 以及后面的内容都要保持空格分开,原因同上
结尾注意以 fi 结束
&&和||快捷操作符
echo "Usage $0 data1 ... dataN"
exit 1
}
&&符号表示的是,如果&&左边的条件满足,便执行&&右边的指令
而不同的是,||表示如果左边的条件没有满足,才执行右边的指令
()运算符
为了在当前shell中执行一组命令,可以用命令分隔符(即",")隔开每一个命令,并把所有的命令用圆括号()括起来。
case语句
类似于C语言中的Switch,case语句
read n
case $n in
1 )
echo "The num is 1"
;;
2 )
echo "The num is 2"
;;
*)
echo "The num is not 1 or 2"
esac
while语句
从1打印到10
i=1
while [ $i -le 10 ]
do
echo $i
let i++
done
for语句
for循环和C语言有很大差别
从1打印到10
i=1
for i in {1..10}
do
echo $i
done
函数的定义
function myfun()
{
return 0
}
如此,便定义了一个简单的函数
需要注意的是,函数体不可以为空
函数可以被认为是一个程序或者小脚本
当该函数被调用时,则会产生新的子进程来执行该函数内部的指令
可以用return 来返回子进程结束的退出码
也可以用echo来返回该函数返回的字符串
脚本的调试
选项
Shell提供了⼀一些⽤用于调试脚本的选项,如下所⽰示:
-n
读⼀一遍脚本中的命令但不执⾏行,⽤用于检查脚本中的语法错误
-v
-x
提供跟踪执⾏行信息,将执⾏行的每⼀一条命令和结果依次打印出来
三种调试方法
命令行提供参数
$ sh -x ./script.sh
脚本开头提供参数
#! /bin/sh -x
利用set命令来启用或者禁用参数
set -x和set +x分别表⽰示l和禁⽤用-x参数,这样可以只对脚本中的某⼀一段进⾏行跟踪调试。
简单进度条的实现
#!/bin/bash
i=0
index=0
arr=( '|' '\\' '-' '/')
str=''
while [ $i -le 100 ]
do
index=i%4
printf "[%-100s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}"
str+='#'
let i++
sleep 0.1
done