Shell 脚本中的命令替换

Shell 脚本中的命令替换
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并通过 运行输出wc -c。您看到的错误消息表明它正在尝试运行“ hellounix”命令,如文件的第一行所示。如果您想将变量的值传递到命令中,您可以使用printf:

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

如果您使用的是 Bash、zsh 或其他更强大的 shell,您还可以使用这里是字符串:

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

<<<对字符串进行扩展"$line",然后将其作为 的标准输入提供wc -c


不过,在这种特殊情况下,您可以使用 shell 的内置参数扩展完全不需要管道即可获取变量值的长度:

val=${#line}

扩展#扩展到:

字符串长度。应替换参数值的字符长度。如果参数为“*”或“@”,则扩展的结果未指定。如果未设置参数且set -u 有效,则扩展将失败。

答案2

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

该行的意思是“将命令的输出分配"$line" | wc -c给变量val”。假设$line是 Holding 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

相关内容