Shell脚本学习

1. 第一行必须是"#!/bin/sh"

  • 它不是注释,"#!/bin/sh"是对shell的声明,说明你所用的是那种类型的shell及其路径所在;
  • 如果没有声明,则脚本将在默认的shell中执行,默认shell是由用户所在的系统定义为执行shell脚本的shell.
  • 如果脚本被编写为在Kornshell ksh中运行,而默认运行shell脚本的为C shell csh,则脚本在执行过程中很可能失败。
  • 所以建议大家就把"#!/bin/sh"当成C 语言的main函数一样,写shell必须有,以使shell程序更严密。

2. 注释:一行开头为 "#"

3. 定义变量

m='memebr'
输出m :memebr

#!/bin/bash
m='member'
echo $m

变量拼接

#!/bin/bash
m='member'
echo $m'是成员'
#!/bin/bash
m='member'
n='是成员'
echo $m$n

输出 member是成员

4. 逻辑符号

命令1 && 命令2

如果左边的“命令1”执行成功,那么右边的“命令2”才会被执行。

命令1 || 命令2

与&&相反。如果“命令1”未执行成功,那么就执行“命令2”。

5. 接收参数

脚本文件“test.sh”,其内容如下:

#!/bin/bash
m=$1
n=$2
echo $m-$n

执行命令:“./test.sh 111 222”;输出 111-222

6. 控制流:if/then/elif/else/fi

注意"["和"]"前后的空格必须有,否则提示错误
结尾必须是fi,if 反过来 fi 相当于Java里的Finally,这里fi是必须的。

#!/bin/bash
myName=$1
if [ "$myName" = "superman" ];then
echo "I know you!"
else
echo "Nice to see you!"
fi

执行命令:“./test.sh superman ”;输出 I know you!

示例:判断文件

if [ -e './test.sh' ];then
echo './test.sh''是文件'
else
echo './test.sh''不是文件'
fi

执行命令:“./test.sh ”;输出 ./test.sh是文件

#!/bin/bash
fileName=$1

if [ -e './'$fileName ];then
echo $fileName'是文件'
else
echo $fileName'不是文件'
fi

执行命令:./test.sh test.sh 输出 test.sh是文件


7567917-63937ff37ac5c220.png
file操作
-b file 检测文件是否是块设备文件,如果是,则返回 true。  [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。    [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。  [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。  [ -k $file ] 返回 false。
-p file 检测文件是否是具名管道,如果是,则返回 true。   [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。  [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。  [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。  [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。    [ -e $file ] 返回 true。

7. 循环:for/do/done

注意:循环项是以“空格”拆分的字符串,类似Java的split

name="super man "
for loop in $name; do
    echo $loop;
done

执行命令:“./test.sh ”;输出 super \n man

8. 格式化输出日期

curdate="`date +%Y%m%d%H%M%S`"
echo $curdate

执行命令:“./test.sh ”;输出 20180323150142

time=$(date +%m-%d--%H:%M:%S)
echo "时间:$time"

执行命令:“./test.sh ”;输出 时间:03-23--15:02:29

9. 系统变量

pwd=$PWD # 当前目录
user=$USER # 当前用户
echo $pwd
echo $user

执行命令:“./test.sh ”;输出 /Users/superman/Desktop /n superman

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章