sh - .profile 함수에서 인수 사용

sh - .profile 함수에서 인수 사용

.profile 파일에 생성된 함수에 매개변수를 사용하고 싶습니다.

매개변수가 제공되지 않으면 입력을 요청하고, 그렇지 않으면 변수를 $1로 설정하고 싶습니다.

$1이 비어 있는지 확인하면 다음 오류가 발생합니다.

sh[7]: 1: Parameter not set.

다음 줄에서 :

if [ ! -n "$1" ]; then

bash 대신 sh를 사용하고 있습니다.

편집: 좋습니다. if 문 끝까지의 첫 번째 코드 줄은 다음과 같습니다.

HOST=`hostname`
cd /opt/dirpath
ll *.sto


if [ x"$1" = x ]; then
  # Ask for input
  echo "File: \c"; read outFile
else
    outFile=$1
fi

매개변수를 사용하거나 사용하지 않도록 다른 사람의 코드를 편집하고 있습니다.

답변1

나는 이것에 더 많은 것이 있다고 생각합니다:

이것은 사용 중인 명령이 아니거나 함수의 다른 곳에서 다르게 수행하고 있는 것입니다. 오류는 에서 발생합니다 ${1?}. 또는 테스트에서 발생하지만 처음에 그렇게 한 경우에만 발생합니다 set -u.

이 문제를 해결하려면 이 작업을 중지하세요. 이렇게 set +u; fn_name하고 무슨 일이 일어나는지 살펴보세요. 확장 기능이 있는 경우 ${1?}함수에 매개변수를 제공할 때까지 이 오류는 사라지지 않습니다.

다음은 오류를 재현하는 방법에 대한 몇 가지 코드 예제입니다.

sh -c 'fn(){ [ ! -n "${1?}" ]; }; fn'
sh: 1: 1: parameter not set

...또는...

sh -uc 'fn(){ [ ! -n "$1" ]; }; fn'
sh: 1: 1: parameter not set

...하지만...

sh -uc 'fn(){ [ ! -n "$1" ]; }
        set +u; fn; echo "$?"'
0

...그리고...

sh -c 'fn(){ [ ! -n "${1?}" ]; }
       fn some args; echo "$?"'
1

기능이 설정되는 경우 -u해당 기능을 편집해야 합니다. 그렇지 않으면, 그렇게 .profile해도 마찬가지입니다. 대부분의 경우 set -u그렇습니다 .아니요지속적인 쉘 설정에 이상적입니다. 이는 모드가 다음과 같기 때문입니다.디자인됨껍질을 죽여라. 생성되는 오류 유형을 처리하는 쉬운 방법을 제공하지 않습니다. 이는 정확히 [test 로 수행 하려는 작업입니다 ].

관련 정보