.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 로 수행 하려는 작업입니다 ]
.