쉘 스크립트는 마치 명령 프롬프트에서 실행되는 것처럼 명령을 실행한다는 것을 알고 있습니다. 함수처럼 쉘 스크립트를 실행할 수 있기를 원합니다. 즉, 입력 값이나 문자열을 스크립트로 가져갑니다. 이 작업을 어떻게 수행합니까?
답변
쉘 명령과 그 명령에 대한 인수는 표시 번호가 쉘 변수를 : $0
, 같은 명령 자체의 문자열 값이 script
, ./script
, /home/user/bin/script
또는 무엇이든을. 모든 인수는 "$1"
, "$2"
등으로 나타납니다 "$3"
. 인수의 개수는 쉘 변수에 "$#"
있습니다.
이 문제를 해결하는 일반적인 방법에는 쉘 명령 getopts
과 shift
. getopts
C getopt()
라이브러리 함수 와 매우 비슷합니다 . shift
값을 $2
to $1
, $3
to $2
등으로 이동합니다 . $#
감소합니다. 코드는의 가치를보고 … 를 "$1"
사용하여 행동을 결정한 후 다음 인수 로 넘어 가기 위해 일 을합니다. 검사 만하면 되고 어쩌면 검사 만하면 됩니다.case
esac
shift
$1
$1
$#
답변
당신과 함께 인수를 전달 액세스 할 수 있습니다 $n
곳 n
인수 번호입니다 – 1, 2, 3, ...
. 다른 명령과 마찬가지로 인수를 전달합니다.
$ cat myscript
#!/bin/bash
echo "First arg: $1"
echo "Second arg: $2"
$ ./myscript hello world
First arg: hello
Second arg: world
답변
$/shellscriptname.sh argument1 argument2 argument3
한 쉘 스크립트의 출력을 다른 쉘 스크립트에 인수로 전달할 수도 있습니다.
$/shellscriptname.sh "$(secondshellscriptname.sh)"
쉘 스크립트 내에서 $1
첫 번째 인수 및 $2
두 번째 인수 등과 같은 숫자로 인수에 액세스 할 수 있습니다 .
답변
형태
$ ./script.sh "$@"
에 가장 편리합니다 argv
. 인수 구분 기호는 공백이지만 변경할 수 있습니다. 얼마나 미성숙한지 기억하지 마십시오. 그런 다음 사용
$1, $2, shift, if [ $# -ne 3 ]
흐름을 제어합니다. 나는 case ... esac
의지가 충분 하다면 보통 getopts를 받아들이지 않습니다 .
답변
bash 스크립트에서 개인적으로 다음 스크립트를 사용하여 매개 변수를 설정하고 싶습니다.
#!/bin/bash
helpFunction()
{
echo ""
echo "Usage: $0 -a parameterA -b parameterB -c parameterC"
echo -e "\t-a Description of what is parameterA"
echo -e "\t-b Description of what is parameterB"
echo -e "\t-c Description of what is parameterC"
exit 1 # Exit script after printing help
}
while getopts "a:b:c:" opt
do
case "$opt" in
a ) parameterA="$OPTARG" ;;
b ) parameterB="$OPTARG" ;;
c ) parameterC="$OPTARG" ;;
? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
esac
done
# Print helpFunction in case parameters are empty
if [ -z "$parameterA" ] || [ -z "$parameterB" ] || [ -z "$parameterC" ]
then
echo "Some or all of the parameters are empty";
helpFunction
fi
# Begin script in case all parameters are correct
echo "$parameterA"
echo "$parameterB"
echo "$parameterC"
이 구조를 사용하면 각 문자에 키 문자를 정의하므로 매개 변수의 순서에 의존하지 않습니다. 또한 매개 변수가 잘못 정의 된 경우 항상 도움말 기능이 인쇄됩니다. 처리 할 매개 변수가 다른 스크립트가 많을 때 매우 유용합니다. 다음과 같이 작동합니다.
$ ./myscript -a "String A" -b "String B" -c "String C"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -b "String B"
String A
String B
String C
$ ./myscript -a "String A" -c "String C" -f "Non-existent parameter"
./myscript: illegal option -- f
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
$ ./myscript -a "String A" -c "String C"
Some or all of the parameters are empty
Usage: ./myscript -a parameterA -b parameterB -c parameterC
-a Description of what is parameterA
-b Description of what is parameterB
-c Description of what is parameterC
답변
./myscript myargument
myargument
$1
내부 가 됩니다 myscript
.
답변
쉘 스크립트에서; 변수 이름 $ 1이됩니다. 두 번째 단어는 변수 이름 $ 2 등이됩니다.
cat << 'EOF' > test
echo "First arg: $1"
echo "Second arg: $2"
echo "List of all arg: $@"
EOF
sh test hello world
쉘 (sh) 매뉴얼 http://heirloom.sourceforge.net/sh/sh.1.html 에서 더 찾을 수 있습니다 .