2017-06-18 82 views
-1

我在學習bash的時候,我堅持比較字符串裏面的if語句。如果在bash(C風格vs Bash)中比較空字符串

腳本:shiftDemo.sh

1 #!/bin/bash 
    2 
    3 #using shift keyword to shift CLA 
    4 
    5 while true 
    6 do 
    7   if [ "$1" = "" ]  #change this statement wrt below cases 
    8   then 
    9     exit 
10   fi 
11   echo '$1 is now ' "$1" 
12   shift 
13 done 

我使用了以下方法:

1.如果(( 「$ 1」= 「」))

2.如果[「 $ 1「=」「]

評論:

1A)$ bash shiftDemo.sh first second third

`shiftDemo.sh: line 7: ((: = : syntax error: operand expected (error token is "= ")` 

1b)的$ sh shiftDemo.sh first second third

shiftDemo.sh: 7: shiftDemo.sh: first: not found 
$1 is now first 
shiftDemo.sh: 7: shiftDemo.sh: second: not found 
$1 is now second 
shiftDemo.sh: 7: shiftDemo.sh: third: not found 
$1 is now third 
shiftDemo.sh: 7: shiftDemo.sh: : Permission denied 
$1 is now 
shiftDemo.sh: 12: shift: can't shift that many 

2)在這種情況下,如果語句運行細跟兩個殼 &給出正確的輸出。

$ bash shiftDemo.sh first second third 
$1 is now first 
$1 is now second 
$1 is now third 

$ sh shiftDemo.sh first second third 
$1 is now first 
$1 is now second 
$1 is now third 

基於上述意見,我的疑惑是:

  1. 什麼是錯的情況1.如何糾正(我想用C風格的語法在我的腳本)。

  2. 哪些語法是首選,使其既SH & bash shell的工作嗎?

+0

重複[**測試bash中的非零長度字符串:\ [-n「$ var」\]或\ [「$ var」\] **](https://stackoverflow.com/questions/3869072/test-for-non-zero-length-string-in-bash-n-var-or-var?noredirect = 1&lq = 1)和[** Unix Bash Shell Script **中的空字符串比較] (https://stackoverflow.com/questions/21407235/null-empty-string-comparision-in-unix-bash-shell-script) –

+1

可能重複[在Unix Bash Shell腳本中的空字符串比較](https: //www.stackoverflow.com/questions/21407235/null-empty-string-comparision-in-unix-bash-shell-script) –

+1

請不要嘗試在shell腳本中使用C風格的語法 - 它們是非常不同的語言,如果你嘗試在shell中寫入C,你將會遇到問題。 –

回答

1

在bash中((...))符號是專門爲算術評估(見手冊頁的算術評估部分)。當執行:

if (("$1" = "")) 

首次,您嘗試分配變量first什麼也沒有,而不是預期的整數值,就像如果你執行:

if ((first =)) 

這沒有任何意義,從而出現錯誤信息。因此,要測試bash變量是否分配了與空字符串不同的值,可以使用test外部命令,即[ ... ]表示法。請輸入man test以查看test可以做什麼。你可以使用任何的:

if [ -z "$1" ] 
if test -z "$1" 
if [ "$1" = "" ] 
if test "$1" = "" 
if [ "X${1}X" = "XX" ] 
if test "X${1}X" = "XX" 
... 

這是很難說什麼((...))做你sh:在大多數系統中,sh是不是原來的Bourne Shell中了。它有時是bash(當被調用爲sh時表現不同),或dash或其他。因此,您應該首先檢查您的系統上有哪些sh

無論如何,如果test也是一個外部命令你sh(無論您sh是),最好是使用它:通過建設,將具有相同的行爲。唯一的區別在於控制結構的語法。