#!解释器符号称为 shebang
用户默认使用的shell在/etc/passwd中设定
shell执行命令的过程如下:
内建命令(which查不到的命令)是会影响到本身shell的状态,比如:cd,alias,source;举例:使用source命令执行脚本时
非内建命令则会先fork一个新shell再使用exec来执行,比如执行ls时;不会影响现在shell的状态
可以使用括号来构造非内建命令,比如(cd ..)这条命令是不会改变此时shell状态
环境变量和本地变量: (惯例,变量名为大写)
前者是可以从shell传给fork出来的子程序的,后者不会传递;创建环境变量使用export variable=value,后者省export命令
各种符号的含义:
$(val)和${val}区别:
前者表示val是一个可执行的程序,后者val是一个变量的名称;
比如 export data=$(date)等价于export data=`date`;而export data2=${date}中date是变量名
单引号和双引号:两者都是保持引号中字符串的字面含义,而双引号除$开头变量以及/开头的转义字符串会翻译
$((s)):将s转换为整形,比如var=3 ,则echo $var+3 结果为3+3,而echo $(($var+3))为6
登录shell和交互非登录shel调用脚本的区别:
在输入认证信息后进入的shell是登录shell,不管是以什么账户登录的,首先会读取/etc/profile文件,其次会读取
此账户下的~/.bash_profile ~/.profile文件;而从这些shell或者是图形管理界面进入的shell是不用输入认证信息的,
这是交互非登录shell,这些shell在启动时是会读取账户下的~/.bashrc文件,而且会从父shell(可能是登录shell)中继承环境变量(非本地变量)
Shell语法:
Shell测试命令条件:(test 和 [ )
常用的有 -f -d -z -n,op(整数比较,不能为字符串,有-ge -eq -le -gt -lt) ,逻辑(! -a -o)
在条件中一般都有变量的参与,而如果变量没有赋值的话则会被展为空,比如:
$FILENAME=/bin/ls
[ ! -f $FILENAME -a $VAR=2 ] #这里被展成 "/bin/ls不存在 and =2" 这就产生语法错误,所以要养成将变量放在双引号内的习惯/
或
test ! -f $FILENAME -a "$VAR"=2
条件控制命令if:
if 条件1 ;then clause1 ; elif 条件2 或 else clause2 ;fi
理念:如果两条命令写在同一行则需要用分号隔开, 如果两条命令写在同一行则需要用分号隔开,一行只写一条命令就不需要写分号了。比如:
if [ 条件 ];then
clause1
与
if [ 条件 ]
then clause1
等价
read命令 :从stdin中读取value赋给name
read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]
One line is read from the standard input, or from the file descriptor fd supplied as an argu-
ment to the -u option, and the first word is assigned to the first name, the second word to
the second name, and so on, with leftover words and their intervening separators assigned to
the last name.If there are fewer words read from the input stream than names, the remaining
names are assigned empty values.比如 :
read test1 test2 【回车】
【输入】abc bcd 则有 echo $test1 $test2 的结果为abc bcd
理念:所有shell的语句都是由命令开头,后面的都是参数,所以参数之间需要有空格;
比如 if [ "$var"="abc" ] 这样的语句是得不到想要的结果的,因为$var="abc"不是比较,而是赋值,因为[是个命令,=在比较时也是一个命令
所以正确的写法是 if [ "$var" = "abc" ] 都需要空格
理念:在shell脚本中$1是命令行中脚本后的第一个输入参数
比如 "bash test.sh helloworld"中的 helloworld 在脚本中可以使用$1来引用
条件控制命令case:
case 变量 in
匹配1|匹配2....|可使用通配符*)
clause1;;
匹配1|匹配2|可使用通配符*)
clause2;;
esac
循环控制命令:
for .. in ..; do (这更像java中的foreach循环)
....
done
和
while 条件;do
...
done
特殊符号:
$0 $1 $2...等价于main 中argv[0] argv[1] argv[2] ....
$#等价于main中的argc-1
$?返回上一次命令执行的状态结果
$@为argvs列表,可用在for in中来列举所有输入参数
shell函数: func(){ ... }
没有返回值和形参,但是它就像一个mini shell一样可以在调用时函数名后列出参数,比如 func argv1...
,这样在func中就可以使用$1..来获取参数,也可以使用return 1等这样的形式来返回值
注:[]这样的条件语句中只能出现上述那些符号(比如-eq -n -f -gt -lt,op, -a -o),如果函数有返回值,则直接使用即可;
比如 if func ; then .... fi
Shell调试参数-x :可以交错显示命令行和其执行结果,查看起来很方便