您的位置:首页 > 运维架构 > Shell

shell基本语法

2010-04-02 09:36 288 查看
1、变量

定义一个变量:varname=value,等号两边不能有空格,否则会被解释成命令。

变量分为本地变量和环境变量。本地变量只存在于当前的shell进程,而环境变量

可以从当前进程传递给fork出来的子进程。printenv可以打印出当前进程的环境变量。

用export可以将本地变量导出成环境变量。用unset可以删除变量。

2、命令代换

可以用`和$()进行命令代换。如:

birth=`date`或birth=$(date)

3、算术代换$(())

var=45

echo $(($var+3))

4、转义字符/

这个/没什么好说的,各种语言都有,不过在shell里有个特殊的地方。

其中“-”加上转义字符也不行,如果要创建一个-hell的文件,你需要这么做

touch ./-hello

5、交互登录的shell

就是输入用户名和密码后得到的shell。

进入登录shell后会执行一系列文件:

/etc/profile、~/.bash_profile、~/.bash_login、~/.profile

在退出时候要执行~/.bash_logout

6、交互非登录的shell

在图形界面打开一个终端或者在登陆shell中执行bash命令,就得到一个交互非登录的shell。

这种shell在启动时自动执行~/.bashrc。

一般在bashrc里面设置本地变量、函数、alias。

7、非交互启动的shell

为执行脚本而fork出来的是非交互shell。

它会执行

BASH_ENV这个环境变量指定的文件。

if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi

8、条件测试

可以用test或[进行条件测试,如果测试结果为真就返回0,如果为假就返回1。

测试两个数的大小:

$ VAR=2
$ test $VAR -gt 1
$ echo $?
0
$ test $VAR -gt 3
$ echo $?
1
$ [ $VAR -gt 3 ]
$ echo $?
1


[是一个命令,传递给它的参数都用空格分开。

常见的测试命令如下:

[ -d dir ] :如果dir存在,返回真

[ -f filename ] :如果filename这个文件存在,就返回真

[ -z string ] :如果string为空返回真

[ -n string ] :如果string不为空返回真

[ string1 = string2 ] :如果相等返回真

[ string1 != string2 ] :如果不相等返回真

[ arg1 OP arg2 ] :OP可以是-gt/-lt/-ge/-le/-eq/-ne中的任意一个。

其他语言常用的!、and、or在shell里面这么表示:

[ ! exp ]

[ exp1 -a exp2 ]

[ exp1 -o exp2 ]

举个例子:

[ -d test -a “$var”="abc" ]

其中$var一般要用引号引起来,否则容易引起错误。原因是,如果var为空的话,这句会被

解释成这样:[ -d test -a ="abc" ],这显然有语法错误,但是加上引号就会被解释成这样:

[ -d test -a ""="abc" ]这样无论如何都不会有语法错误了。

9、if语句

if语句常常包含以下关键词:

if、then、
else、elif、fi。

if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
if :; then echo "always true"; fi


if [ -f ~/.bashrc ]是一条,then . ~/.bashrc、fi各是一条。如果两条写在一块,就要用“;”分割。

:是一个空命令,表示什么也不执行。

10、case语句

#! /bin/sh
echo "Is it morning? Please answer yes or no."
read YES_OR_NO
case "$YES_OR_NO" in
yes|y|Yes|YES)
echo "Good Morning!";;
[nN]*)
echo "Good Afternoon!";;
*)
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
exit 1;;
esac
exit 0


11、for/do/done

#! /bin/sh
for FRUIT in apple banana pear; do
echo "I like $FRUIT"
done


12、while/do/done

#! /bin/sh
echo "Enter password:"
read TRY
while [ "$TRY" != "secret" ]; do
echo "Sorry, try again"
read TRY
done


13、位置参数和特殊变量

$0:文件名

$#:参数个数

$@:参数列表,不包括$0

$?:上一次命令执行是否成功的标志

$$:进程id

14、函数

调用函数时可以传递任意个参数,在函数内提取参数用$0/$1....

下面这个脚本可以一次创建多个目录,各目录名通过命令行参数传入,脚本逐个测试各目录是否存在,如果目录不存在,首先打印信息然后试着创建该目录。

#! /bin/sh
is_directory()
{
DIR_NAME=$1
if [ ! -d $DIR_NAME ]; then
return 1
else
return 0
fi
}
for DIR in "$@"; do
if is_directory "$DIR"
then :
else
echo "$DIR doesn't exist. Creating it now..."
mkdir $DIR > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "Cannot create directory $DIR"
exit 1
fi
fi
done


15、脚本的调试

sh -x ./test.sh:这样可以将执行的每一条命令和结果打印出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: