# 脚本开发
# 一、部分方法
1、条件分支结构
if [ -d "$JAVA_HOME/bin" ] ; then
PATH="$JAVA_HOME/bin:$PATH"
1
2
2
2、限定运行权限
if [ "$USER" != 'jboss1' ]; then
echo "Sorry, this script must be run as JBOSS1!"
exit 1
fi
echo "continue script"
1
2
3
4
5
2
3
4
5
3、根用户判别
if [ "$UID" -gt 0 ]; then
echo "Sorry, this script must be run as ROOT!"
exit 1
fi
echo "continue script"
1
2
3
4
5
2
3
4
5
4、带参数执行程序
$#
表示参数数量
if [ $# -eq 0 ]; then
echo "No arguments provided"
exit 1
fi
echo "arguments found: $#"
1
2
3
4
5
2
3
4
5
5、交互输入
echo "enter a word please:"
read word
echo $word
1
2
3
2
3
read -p "Install Software ?? [Y/n]: " answ
if [ "$answ" == 'n' ]; then
exit 1
fi
echo "Installation starting..."
1
2
3
4
5
2
3
4
5
6、Shell中单引号和双引号区别
新建文件test.sh
,内容如下:
#!/bin/bash
do_date=$1
echo '$do_date'
echo "$do_date"
echo "'$do_date'"
echo '"$do_date"'
echo `date`
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
执行结果
test.sh 2019-02-10
$do_date
2019-02-10
'2019-02-10'
1
2
3
4
2
3
4
总结:
- 单引号不取变量值
- 双引号取变量值
- 反引号`,执行引号中命令
- 双引号内部嵌套单引号,取出变量值
- 单引号内部嵌套双引号,不取出变量值
# 二、重定向
# 2.1 标准输出(stdout)重定向 >、>>、1>、1>>
>
或 >>
符号之前的命令输出结果,会被写入到紧跟的文件名对应的文件中。>
和 1>
具有相同的效果,因为 1
就代表着标准输出。如果不显式指定 1
,则默认为标准输出。>>
和 1>>
将数据附加到文件的末尾。使用 >
或 >>
时,如果文件不存在,则会创建对应文件。
[zexcon ~]$ ls -l ~ > learnToScriptOutput
1
# 2.2 标准错误(stderr)重定向 2>、2>>
2>
和 2>>
具有相同的效果,但 2>>
是将数据追加到文件末尾。你可能会想,这有什么用?不妨假象一下用户只想捕获错误信息的场景,然后你就会意识到 2>
或 2>>
的作用。数字 2
表示本应输出到终端的标准错误信息输出。现在我们试着追踪一个不存在的文件,以试试这个知识点。
[zexcon ~]$ ls -l /etc/invalidTest 2> learnToScriptOutputError
1
# 2.3 所有输出重定向 &>、&>>、|&
如果你不想将标准输出(stdout
)和标准错误信息(stderr
)写入不同的文件,那么在 Bash 5 中,你可以使用 &>
将标准输出和标准错误重定向到同一个文件,或者使用 &>>
追加到文件末尾。
[zexcon ~]$ ls -l ~ &>> learnToScriptAllOutput
[zexcon ~]$ ls -l /etc/invalidTest &>> learnToScriptAllOutput
1
2
2