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が適用されると、拡張は失敗します。