너 무슨 잘못했어?

너 무슨 잘못했어?

다음 스크립트가 있습니다.

echo  'Please select type file , the name of the input file and the name of the output file:

     a.plain ( please press a ) <input_file> <output_file>;
     b.complex ( please press b ) <input_file> <output_file>;'

read one two three
echo $#

if  [ $# -ne 3 ]; then
   echo "Insufficient arguments !"
   exit 1;
else
   echo "Number of passed parameters is ok"
fi

$#항상 0을 출력하고 나중에 스크립트에서 $one, $two 및 $third를 사용할 때 read 명령이 올바른 변수를 제공합니다.

감사해요.

답변1

모든 변수의 값을 가져오고 그렇지 않으면 종료하는지 테스트하려면 -z빈 문자열에 대한 테스트를 사용하십시오.

if [ -z "$one" ] || [ -z "$two" ] || [ -z "$three" ]; then
    echo 'Did not get three values' >&2
    exit 1
fi

가치 $#는 수량이다위치 매개변수, 일반적으로 명령줄 인수(또는 set내장 설정 값)입니다. 이들은 $1, $2등에서 $3(또는 배열로 함께 "$@") 사용할 수 있으며 내장 함수가 읽는 값과 무관합니다 read.


스크립트가 입력을 대화형으로 읽는 대신 명령줄 인수로 사용하도록 하십시오(사용자가 탭 완성 기능을 활용할 수 있고 더 쉽게 사용할 수 있으므로 사용자가 하나 이상의 경로를 제공하려는 경우 선호될 수 있습니다). 터미널 연결이 필요 없이 다른 스크립트 내에서 스크립트 사용)

if [ "$#" -ne 3 ]; then
    echo 'Did not get three command line arguments' >&2
    exit 1
fi

one=$1
two=$2
three=$3

이 경우 스크립트는 다음과 같이 실행됩니다.

./script.sh a.plain /path/to/inputfile /path/to/outputfile

입력 처리가 표준 입력에서 이루어질 수 있는지 여부 및 출력이 표준 출력으로 전송될 수 있는지 여부(예: 실제로 그렇지 않은 경우)필요스크립트 내의 입력 및 출력 파일에 대한 명시적 경로), 스크립트는 첫 번째 인수( a.plain또는 b.complex)만 사용하면 됩니다.

./script.sh a.plain </path/to/inputfile >/path/to/outputfile

그런 다음 스크립트는 입력 및 출력에 표준 입력 및 표준 출력 스트림을 사용합니다.하나의명령줄 매개변수).

이를 통해 다른 프로그램의 데이터 입력을 사용하여 스크립트를 실행할 수 있으며 추가 후처리도 가능합니다.

gzip -dc <file-in.gz | ./script.sh a.plain | sort | gzip -c >file-out.gz

답변2

너 무슨 잘못했어?

입력 매개변수(시작 시 스크립트)와 읽기(런타임 시)를 사용하는 사용자 입력을 혼동하고 있습니다.

$#시작 시 매개변수 수를 보고합니다. 예를 들어 ./«script_name» 1 2 3스크립트에서 사용하면 3이 반환됩니다.

답변3

set이 명령을 사용하여 위치 매개변수를 재설정하고 이전 값을 덮어쓸 수 있습니다. 이 IFS변수는 구분 기호로 사용되는 문자 목록을 지정하므로 이를 사용하여 CSV를 구문 분석할 수도 있습니다. 이는 set내장 명령이므로 단일 명령에 대해 변수를 재정의하는 일반적인 구문은 작동하지 않습니다. 명령 앞에 지정된 변수는 env하위 프로세스에 대한 환경을 설정하는 명령에 대한 약어이기 때문입니다.

$#현재 존재하는 위치 매개변수의 수입니다.

$ read foo
a b c d e      
$ echo $foo
a b c d e
$ set -- $foo
$ echo $#
5
$ IFS=: set -- $foo                  # doesn't work
$ echo $#
5                                    # still got 5
$ IFS=:
$ set -- $foo
$ echo $#
1

관련 정보