# 脚本开发

# 条件分支结构

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

# 根用户判别

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

# 带参数执行程序

$#表示参数数量

if [ $# -eq 0 ]; then
    echo "No arguments provided"
    exit 1
fi
echo "arguments found: $#"
1
2
3
4
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

# 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. 单引号内部嵌套双引号,不取出变量值

# 重定向

# 输出stdout
file > myfiles.txt

# 输出stderr
file 2> myfiles-err.txt

# 同时输出stdout和stderr
file &> alloutput.txt

# 重定向文件到命令
mysql -u user1 p db_name < db.sql
mysql -u user1 p db_name < db.sql > out.txt 2> outeer.txt

# 同时传递stdout和stderr到管道
find 2>&1 | grep example.txt

# 在当前目录(以及其子目录)中查找文件和目录,然后通过管道将结果传递给grep命令,以筛选包含字符串'example.txt'的行。
find |& grep example.txt

# 同时传递stdout和stderr,并把stdout丢弃
find 2>&1 >/dev/null | grep example.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 判断退出状态

# 获取上一条命令的退出状态
exit_status=$?

# 判断退出状态
if [ $exit_status -ne 0 ]; then
echo "上一条命令执行失败,退出脚本。"
exit 1
fi
1
2
3
4
5
6
7
8
更新时间: 12/27/2023, 8:26:31 PM