关于bash:在继续之前检查参数是否存在

Check argument exists before proceeding

我使用以下脚本来存档和删除用户帐户。

脚本要求名称列表为$1,但如果第一个参数不存在,我希望立即停止脚本,并通知用户正确的用法。

非常感谢您的建议和任何其他改进!

谢谢,丹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
PATH=/bin:/usr/bin:/sbin:/usr/sbin export PATH

DESTDIR='/Volumes/UserStorage/Backups'
SRCDIR='/Volumes/UserStorage/Users'
LOG=`mktemp -t archive-accounts-XXXXX.log`
EMAIL_FROM='[email protected]'
EMAIL_TO='[email protected]'
EMAIL_SUBJ='Account archiving batch job report'


{
echo"Batch Begins...`date`"
echo"###############"
echo""

while IFS= read -r line
# If not first argument, script should exit with usage message
do
    echo Starting account $line
    hdiutil create $DESTDIR/$line-$(date +%d-%m-%y).dmg -srcfolder $SRCDIR/$line
    RETCODE=$?
    if [ $RETCODE -eq 0 ]; then
  STATUS="Success"
  # rm -rf $SRCDIR/$line
  else
  STATUS="FAILED!"
  fi
  echo Exit Status: $STATUS
  echo Finished with account $line
  echo""

done < $1

echo"###############"
echo"Batch complete! `date`"

} >> $LOG 2>&1

cat $LOG | mailx -s"$EMAIL_SUBJ" $EMAIL_TO

exit 0


这里有一个较短的选择:

1
requiredArg=${1?no argument supplied, exiting...}

如果没有设置$1,则?后面的文本将输出到stderr(带前导码-见下文),脚本将退出,代码为1;如果设置$1,则其值将简单地分配给变量requiredArg

前导码是脚本的路径(调用时)、错误触发行的编号和未设置参数(变量)的名称;在现有情况下,它可能如下所示:

1
./someScript: line 3: 1: no argument supplied, exiting...

如果您发现自己在多个地方进行检查,那么可能需要定义一个小助手函数,如下所示:

1
2
# Define helper function that outputs to stderr and exits with code 1.
die() { echo"$*" 1>&2; exit 1; }

然后您可以使用它,如下所示:

1
2
# Abort, if no arguments were passed.
(( $# > 0 )) || die"no argument supplied, exiting..."

正在添加以下内容:

1
2
3
4
if (($# == 0)); then
  echo"no argument supplied, exiting..."
exit 1
fi