쉘 스크립트의 명령 대체

쉘 스크립트의 명령 대체
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

관련 정보