2010-05-23 22 views
3

我想要用戶在命令行輸入東西-l或-e。 例如, 。$/report.sh -e 我想if語句分裂他們做出任何決定,所以我已經試過......如何比較shell中的2個字符串?

if [$1=="-e"]; echo "-e"; else; echo "-l"; fi 

顯然是行不通的,雖然 感謝

回答

9

我使用:

if [[ "$1" == "-e" ]]; then 
    echo "-e" 
else 
    echo "-l"; 
fi 

然而,分析論證,getopts可能使您的生活更輕鬆:

while getopts "el" OPTION 
do 
    case $OPTION in 
     e) 
      echo "-e" 
      ;; 
     l) 
      echo "-l" 
      ;; 
    esac 
done 
+0

你說「getopt」和「getopts」。他們是兩回事。前者是一個獨立的可執行文件,後者是內置的shell。 – 2010-05-23 02:05:02

+0

D'oh - 固定。謝謝。 – 2010-05-23 03:10:12

3

如果你想這一切在同一行(通常它使得它很難讀):

if [ "$1" = "-e" ]; then echo "-e"; else echo "-l"; fi 
1

你需要方括號,發生的事情裏面他們之間的空格。此外,只需使用一個=。您還需要一個then

if [ $1 = "-e" ] 
then 
    echo "-e" 
else 
    echo "-l" 
fi 

具體到-e的問題但是是它在echo特殊的意義,所以你不可能得到任何東西。如果您嘗試echo -e,則不會顯示任何內容,而echo -decho -f可以完成您所期望的操作。在它旁邊放一個空格,或者用括號括起來,或者用其他方法將它發送到echo時不完全是-e

1

如果您只想打印用戶提交的參數,則可以簡單地使用echo "$1"。如果用戶還沒有提交任何內容,如果要恢復爲默認值,則可以使用echo "${1:--l}(默認值爲:-是Bash語法)。然而,如果你想真正強大和靈活的參數處理,你可以看看getopt

params=$(getopt --options f:v --longoptions foo:,verbose --name "my_script.sh" -- "[email protected]") 

if [ $? -ne 0 ] 
then 
    echo "getopt failed" 
    exit 1 
fi 

eval set -- "$params" 

while true 
do 
    case $1 in 
     -f|--foo) 
      foobar="$2" 
      shift 2 
      ;; 
     -v|--verbose) 
      verbose='--verbose' 
      shift 
      ;; 
     --) 
      while [ -n "$3" ] 
      do 
       targets[${#targets[*]}]="$2" 
       shift 
      done 
      source_dir=$(readlink -fn -- "$2") 
      shift 2 
      break 
      ;; 
     *) 
      echo "Unhandled parameter $1" 
      exit 1 
      ;; 
    esac 
done 

if [ $# -ne 0 ] 
then 
    error "Extraneous parameters." "$help_info" $EX_USAGE 
fi