2017-02-15 6 views
1

私の配列から名前に2つの '_'文字が含まれているフォルダの設定を解除しようとしていますが、許可が拒否されました。あなたはそれを修正するために私を助けてもらえますか? ${ALLVERSION[i]に保存されたファイルが実行されるechoなければエコー結果をシェルスクリプトのifチェックで使用する

if [[ `echo ${ALLVERSION[i]} | grep -o '_' | wc -l` -eq 2 ]]; then 

と:

#!/bin/sh 

ALLVERSION=(/dir/test*) 
echo "first version:" 
for ((i=0; i<${#ALLVERSION[@]}; i++)); do 
    if [[ `${ALLVERSION[i]} | grep -o '_' | wc -l` -eq 2 ]]; then 
    unset ALLVERSION[i] 
    fi 
done 
echo "last version:" 
for f in "${ALLVERSION[@]}"; do 
    echo "$f" 
done 

結果:grepに配管する前に、

first version: 
countcharacter.sh: line 6: /dir/test03_01.txt: Permission denied 
countcharacter.sh: line 6: /dir/test03_01_01.txt: Permission denied 
countcharacter.sh: line 6: /dir/test03_01_04.txt: Permission denied 
countcharacter.sh: line 6: /dir/test03_04.txt: Permission denied 
countcharacter.sh: line 6: /dir/test03_05_04.txt: Permission denied 
countcharacter.sh: line 6: /dir/test04_01_04.txt: Permission denied 
countcharacter.sh: line 6: /dir/test05_00.txt: Permission denied 
countcharacter.sh: line 6: /dir/test05_01.txt: Permission denied 
countcharacter.sh: line 6: /dir/test06_01.txt: Permission denied 
last version: 
/dir/test03_01.txt 
/dir/test03_01_01.txt 
/dir/test03_01_04.txt 
/dir/test03_04.txt 
/dir/test03_05_04.txt 
/dir/test04_01_04.txt 
/dir/test05_00.txt 
/dir/test05_01.txt 
/dir/test06_01.txt 
+0

の場合[[ 'エコー$ {ALLVERSION [I]} | grep -o '_' | wc -l' -eq 2]]; – zzn

答えて

1

あなたがしなければならないecho ${ALLVERSION[i]}ここに私のスクリプトとその出力がありますその出力はgrepに渡されます。

副命令として、構文を使用して、バックティック`yourcommand`よりも読みやすくすることをお勧めします。

+0

それは今、多くのおかげで動作しています! –

1

この便利なSLePort's answerのほかに、ネイティブのbashツールだけで、サードパーティのツールをフォークする必要はありません。

echo "first version:" 
for ((i=0; i<${#ALLVERSION[@]}; i++)); do 

    # Strip every character that is not '_', so "${#count}" will be 2 for 
    # those lines containing two '_' 
    count="${ALLVERSION[i]//[!_]/}" 

    if (("${#count}" == 2)); then 
     unset ALLVERSION[i] 
    fi 
done 

echo "last version:" 
for f in "${ALLVERSION[@]}"; do 
    echo "$f" 
done 
+1

コマンド置換、パイプなし、それほど読みやすく... – SLePort

+0

@SLePort:フィードバックのおかげで、古くなったエラーが発生しやすい 'syntax – Inian

1

ファイルのすべての行を処理している場合を除き、grepはめったに必要ありません。 1行の入力には、bashの正規表現演算子を使用します。

if [[ ${ALLVERSION[i]} =~ /dir/test_[^_]*_[^_]* ]]; then 
    unset ALLVERSION[i] 
fi 

または拡張パターンマッチ使用:

# If you are using an older version of bash, you'll need 
# to set the extglob option first. 
# shopt -s extglob 
if [[ ${ALLVERSION[i]} == /dir/test_*(!(_))_*(!(_)) ]]; then 
    unset ALLVERSION[i] 
fi 
関連する問題