Ubuntuでこのwhile-caseが機能しないのはなぜですか?

Ubuntuでこのwhile-caseが機能しないのはなぜですか?

BSDから完全なLinuxに移行しています。 Ubuntu 16.04のスクリプト

#!/bin/sh
while (( "$#" )); do
   case "$1" in
    -i | --ignore-case)
        [ $# -ne 2 ] && echo "2 arguments i needed" && exit 1
        case_option=-i
        ;;
    -*)
        echo "Error: Unknown option: $1" >&2
        exit 1
        ;;
     *) # No more options
        break
        ;;
   esac

   shift
done

# -o, if not, then ...
find $HOME ! -readable -prune -o \
    -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -R -

エラーはループにあります。

  • sh ./script masi期待した出力と同じ出力を返します。
  • ランニングsh ./script -i masi。出力:空のファイル。期待される出力:結果のリスト。スタウトは./script: 2: ./script: 2: not found Vim: Reading from stdin...

考えられるエラー

  • while (( "$#" ))
  • ...

何らかの理由でこのオプションはまったく使用できません。

getoptsに行きたい動機 - Terdonの答え

地図時間そして答えここ

case_option=""

while getopts "i:" opt; do
    case $opt in
        i | ignore_case) 
            [[ $# -ne 2 ] && echo "2 arguments i needed" && exit 1
            case_option=-i
            ;;
        -*)
            echo "Error: Unknown option: $1" >&2
            exit 1
            ;;
        *) # No more options 
           break
           ;;
    esac
done

find $HOME ! -readable -prune -o \
   -type f -name "*.tex" -exec grep -l $case_option "$1" {} + | vim -R -

どこ

  • ./script masiまたは電話で./script -i masi

whileケースを繰り返す方法は?

ベストアンサー1

dashshorの代わりにandを使用して実行するため失敗しますbash。 Ubuntuは、最小限のPOSIX互換シェルである/bin/shシンボリックリンクです。/bin/dash最も簡単な解決策はスクリプトを実行することですが、期待bashどおりに機能しません。

bash ./script masi

また、シェバンラインがあることに注意してください。

#!/bin/sh

つまり、実行する必要はなく、sh ./script実行するだけです./script。代わりに、bashを指すようにshebang行を変更してくださいsh

#/bin/bash

sh(Ubuntuで)頑固な場合は、ループを次のように変更するdash必要があります。while

while [ "$#" -gt 0 ]; do

または、次のことを見たいと思うかもしれません。getopts

おすすめ記事