シェルスクリプトのコマンドの置き換え

シェルスクリプトのコマンドの置き換え
511@ubuntu:~/Unix$ cat pass

hellounix
file1

#!/usr/bin
echo "Enter File Name"
read file
if [ -f $file ]
 then
    echo "File Found with a Name $file\n"
    echo "File Content as below\n"
    count=0
    val=0
    while read line
        do
        val=$("$line" | wc -c)
        echo "$line -->Containd $val Charecter"        
        count=$((count+1))
        done < $file
    echo "Total Line in File : $count"
else 
    echo "File Not Found check other file using running script"
fi

出力:

511@ubuntu:~/Unix$ sh digitmismatch.sh
Enter File Name
pass
File Found with a Name pass

File Content as below

digitmismatch.sh: 1: digitmismatch.sh: hellounix: **not found**
hellounix -->Containd 0 Charecter
digitmismatch.sh: 1: digitmismatch.sh: file1: **not found**
file1 -->Containd 0 Charecter
Total Line in File : 2
==============================================================

wc -c変数に値が割り当てられていないのはなぜですかval

答え1

あなたの行は次のとおりです

val=$("$line" | wc -c)

これ努力するで提供されたコマンドを実行し$line、runに出力を渡しますwc -c。表示されるエラーメッセージは、hellounixファイルの最初の行に示すように ""コマンドを実行しようとしていることを示します。変数の値をコマンドに渡すには、次のようにします。printf:

val=$(printf '%s' "$line" | wc -c)

Bash、zsh、または他のより強力なシェルを使用している場合は、次のものも使用できます。ここに文字列があります:

val=$(wc -c <<<"$line")

<<<文字列を拡張して"$line"標準入力として提供しますwc -c


しかし、この特別なケースでは、シェルに組み込まれていますパラメータ拡張配管をまったく使用せずに変数値の長さを取得します。

val=${#line}

拡張は#次に拡張されます。

文字列の長さ。パラメーター値を置き換える必要がある文字の長さ。引数が「*」または「@」の場合、拡張結果は指定されません。パラメータが設定されておらず、set -uが適用されると、拡張は失敗します。

答え2

val=$("$line" | wc -c)

この行は「コマンドの出力を"$line" | wc -c変数に代入val」を意味します。$lineHolding を仮定すると、hellounix次のようになります。

val=$(hellounix | wc-c)

名前付きコマンドを実行しようとしましたhellounixが、見つからないため、hellounix: not foundエラーが発生します。

簡単な修正は、echo次のように追加することです。

val=$(echo -n "$line" | wc -c)

このオプションは、行を標準出力に「反転」してから渡しますwc。このオプションは、計算-n時に行末の改行文字を削除します。wc行末で改行を数えるには、この-nオプションを削除します。

そしてecho -n

Enter File Name
testfile
File Found with a Name testfile

File Content as below

hellounix -->Containd 9 Charecter
file1 -->Containd 5 Charecter
Total Line in File : 2

以下のみecho:

Enter File Name
testfile
File Found with a Name testfile

File Content as below

hellounix -->Containd 10 Charecter
file1 -->Containd 6 Charecter
Total Line in File : 2

関連情報