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
"을 의미합니다. $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