[英]“Option does not exist” with bash case statement
我正在嘗試執行以下操作以向 bash 命令添加一個簡單的開關。 該標志用於打開一個選項以使用另一個名為“終端”的程序執行某些文件備份任務。
但是,當我像這樣運行我的腳本(名為prepmultidev.sh
)時:
bash prepmultidev.sh mysite.updatejan31 -b
當我在命令末尾添加-b
選項時,它顯示“跳過備份”(即使它應該說“正在備份實時/測試/開發...”)然后我收到一條錯誤消息“ '-b' 選項不存在”。 當我不添加它時,它仍然顯示“跳過備份”(現在正確),但返回“沒有足夠的 arguments(缺少:'multidev')。” 在閱讀了教程后,我使用的代碼與其他人使用的代碼相同,但我的不是,我仍然和剛開始時一樣困惑。
#!/bin/bash
# Example: bash prepmultidev.sh mysite multidevname
# will back up live/test/dev and create a multidev of mysite.
# Add the -b flag if a backup of live/test/dev is required.
SITE=$1
MULTIDEV=$2
BACKUP=$3
# Exit on error
set -e
# Authenticate Terminus
terminus auth:login --machine-token=J6nCtWYtva8dtPk3xQ95ZJIG6FuSfQ6t14c0to-tmhH9R
# Check to see if a backup is needed of live/test/dev.
case "$BACKUP" in
b)
echo "Backing up live/test/dev..."
# Create backups of live, test, and dev environments
terminus backup:create $SITE.live &
terminus backup:create $SITE.test &
terminus backup:create $SITE.dev &
;;
*)
echo "Skipping backup"
;;
esac
# Now do some other stuff with $SITE.$MULTIDEV
我缺少什么來使它在存在時識別-b
標志並進行備份,或者在不存在時簡單地回顯“跳過備份”?
bash case
語句要求您指定模式,但如果您不指定任何模式匹配語法,它將僅匹配整個字符串。 在您的示例中, b)
將匹配b
,但不匹配-b
。
要解決您的直接問題,您可以在您的案例模式中指定-
以使其匹配:
case "$BACKUP" in
-b)
echo "Backing up live/test/dev..."
# Create backups of live, test, and dev environments
terminus backup:create $SITE.live &
terminus backup:create $SITE.test &
terminus backup:create $SITE.dev &
;;
*)
echo "Skipping backup"
;;
esac
但是,如果您希望添加更多標志,則使用getopts
或更靈活的GNU getopt
可能會更好(如果您可以使用它,請不要與 BSD 或 POSIX getopt
混淆,后者更受限制)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.