# 脚本开发

# 一、部分方法

1、条件分支结构

if [ -d "$JAVA_HOME/bin" ] ; then
    PATH="$JAVA_HOME/bin:$PATH"
1
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

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

4、带参数执行程序

$#表示参数数量

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi
echo "arguments found: $#"
1
2
3
4
5

5、交互输入

echo "enter a word please:"
read word
echo $word
1
2
3
read -p "Install Software ?? [Y/n]: " answ
if [ "$answ" == 'n' ]; then
    exit 1
fi
    echo "Installation starting..."
1
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

执行结果

test.sh 2019-02-10
$do_date
2019-02-10
'2019-02-10'
1
2
3
4

总结:

  1. 单引号不取变量值
  2. 双引号取变量值
  3. 反引号`,执行引号中命令
  4. 双引号内部嵌套单引号,取出变量值
  5. 单引号内部嵌套双引号,不取出变量值

# 二、重定向

# 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/7/2022, 11:22:24 AM