簡體   English   中英

如何比較bash中的兩個字符串?

[英]How can I compare two strings in bash?

我正在嘗試刪除可以由“ .c”源文件派生的文件夾中的所有“ .s”文件。 這是我的代碼

for cfile in *.c; do 
    #replace the last letter with s
    cfile=${cfile/%c/s}
    for sfile in *.s; do
        #compare cfile with sfile; if exists delete sfile
        if [ $cfile==$sfile ]; then
            rm $sfile;
        fi
    done
done

但是此代碼將刪除所有“ .s”文件。 我認為它沒有正確比較文件名。 有人可以幫忙嗎?

比較bash中字符串的規范方法是:

if [ "$string1" == "$string2" ]; then

這樣,如果其中一個字符串為空,它將仍然運行。

您可以像這樣使用它:

[[ "$cfile" = "$sfile" ]] && rm "$sfile"

要么

[[ "$cfile" == "$sfile" ]] && rm "$sfile"

或通過使用舊的/bin/[ (測試)程序

[ "$cfile" = "$sfile" ] && rm "$sfile"

if [ $chile==$sfile ]; then

永遠是真的,因為這等於說

if [ something ]; then

始終確保操作員周圍有空間。

另一個問題是您在說:

cfile=${cfile/%c/s}

您可能想說:

sfile=${cfile/%c/s}

而且您需要擺脫內循環:

for sfile in *.s; do
done

只需保留比較代碼即可。

我認為最簡單的解決方案是:

for cfile in *.c ; do rm -f "${cfile%.c}.s" ; done

它僅列出所有.c文件並嘗試刪除相應的.s文件(如果有)。

for cFile in *.c; do
    sFile="${cFile%c}s"
    if [[ -f "$sFile" ]]; then
        echo "delete $sFile"
    fi
done

我將實際刪除文件作為練習。 :-)

您也可以蠻力刪除所有內容,然后將錯誤消息重定向到/dev/null

for cFile in *.c; do
    sFile="${cFile%c}s"
    rm "$sFile" &> /dev/null
done

但這當然會慢一些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM