명령줄에서 파일 이름을 인수로 가져오는 프로젝트를 시작하고 있습니다. 다른 곳에서는 이에 대한 정보를 찾을 수 없습니다. 이것이 첫 번째 단계이므로 아직 코드가 없습니다.
도움을 주셔서 미리 감사드립니다. 여기에서 제안하실 수 있는 모든 제안을 적극적으로 시도해 보겠습니다.
답변1
위치 매개변수 다루기
먼저 명확히 해두겠습니다. bash 스크립트를 참조할 때 명령줄 매개변수를 "위치 매개변수"라고 합니다. 즉, $1
. 이것이 제가 여기서 사용할 용어입니다.$2
$3
올바른 쉘 구문에 따르면 위치 매개변수는 명령 뒤에 나타납니다(분명히 어떤 사람들은 말도 안 된다고 말할 수도 있지만 구문이 중요합니다):
command a b c
command
그것이 귀하의 스크립트라고 가정하십시오 my_script.sh
. 스크립트에서 echo $1
및 같은 매개변수에 대해 개별 명령을 실행할 수 있습니다 echo $2
. 당신도 참여할 수 있습니다모두for 루프를 통해 즉시 가져옵니다. 예를 들어 간단한 스크립트는 다음과 같습니다.
#!/bin/sh
# Note important difference between /bin/sh and /bin/bash
# https://askubuntu.com/q/141928/295286
echo "$1"
# for loop will substitute each $1, $2,$3 value into i each time
for i
do
echo "$i"
done
파일 이름 부분 해결
위치 매개변수는 무엇이든(숫자 또는 텍스트) 될 수 있다는 사실은 해석을 스크립트 작성자에게 맡깁니다. 텍스트 문자열이 파일 이름인 경우 당연히 파일 시스템 어딘가에 존재해야 합니다(익명의 파일, 파이프 또는 소켓과 달리 [여기서 인용 필요]).
my_script "this_is_my_file.txt". Simple way to test whether
this_is_my_file.txt`가 기존 파일 이름이기 때문에 스크립트를 호출한다고 가정합니다 .
test -f "$1"
또는
[ -f "$1" ]
왜? $1
첫 번째 위치 매개변수이기 때문입니다. 왜 test
또는 [
? 왜냐하면 같은 명령이기 때문입니다. 거기에서 당신은 그것을 사용할 수 있습니다
if [ -f "$1" ]; then
echo "$1" exists
fi
또는
[ -f "$1" ] && echo "$1" exists
물론, 좋은 스크립트라면 오류를 발생시키고 파일이 존재하지 않으면 스크립트가 종료되도록 하는 것이 현명할 것입니다.
스크립팅에 있어서 중요한 것 중 하나는 스크립팅을 하는 습관을 들이는 것입니다. 사용자가 스크립트에 제공할 파일 이름을 예측할 수 없으므로 임의의 파일 이름이 될 수 있습니다 -
. 즉, -afilename
. 이러한 파일 이름은 위치 인수를 처리해야 하는 스크립트와 일반 명령을 손상시키는 경우가 많습니다. 파일 이름이 존재할 것으로 예상하거나 특별히 요구하는 경우현재 작업 디렉토리에, 변수보다 먼저 사용하는 것이 가장 좋습니다 ./
.
if [ -f ./"$1" ]
사용자가 명시적으로 그렇게 말한 경우에도 ./
여전히 작동합니다 .
$ test -f ././input.txt && echo "YES"
YES
파일 경로도 포함하는 파일 이름을 처리하는 경우에는 문제가 되지 않습니다. 파일 이름 앞의 마지막 슬래시는 /path/to/-difficult_name.txt
파일 이름을 나머지 경로와 구분합니다.
...나중에 수정하고 확장하세요...
답변2
인수를 사용하여 스크립트를 호출하면 해당 인수가 스크립트에 인수로 전달됩니다.위치 매개변수. 이러한 매개변수는 $1
, ... 를 사용하여 $2
호출 할 수 있습니다 ${10}
. ${11}
참고: 모든 두 자리 매개변수에는 괄호가 필요합니다.
또한 및는 $@
다음 $*
과 같은 모든 매개변수를 나타내는 데 사용될 수 있습니다.
($*)는 1부터 시작하는 위치 매개변수로 확장됩니다. 확장이 큰따옴표 안에 있지 않으면 각 위치 인수가 별도의 단어로 확장됩니다. 이러한 단어는 실행되는 컨텍스트에서 단어 분할 및 경로 이름 확장이 추가로 적용됩니다. 큰따옴표 내에서 확장이 발생하면 IFS 특수 변수의 첫 번째 문자로 구분된 각 인수의 값을 사용하여 단일 단어로 확장됩니다. 즉, "$*"는 "$1c$2c..."와 동일합니다. 여기서 c는 IFS 변수 값의 첫 번째 문자입니다. IFS가 설정되지 않은 경우 매개변수는 공백으로 구분됩니다. IFS가 비어 있으면 매개변수를 연결할 때 구분 기호가 삽입되지 않습니다.
그리고
($@)는 1부터 시작하는 위치 매개변수로 확장됩니다. 큰따옴표 내에서 확장이 발생하면 각 인수가 별도의 단어로 확장됩니다. 즉, "$@"은 "$1" "$2"와 동일합니다... 단어 내에서 큰따옴표 확장이 발생하는 경우 첫 번째 인수의 확장은 원래 단어의 시작 부분과 연결되고 마지막 인수의 확장은 원래 단어의 마지막 부분과 연결됩니다. 위치 인수가 없으면 "$@" 및 $@는 아무것도 확장되지 않습니다(즉, 삭제됩니다).
다음은 이 예를 보여주는 스크립트입니다.
스크립트
#!/bin/sh
echo "My arguments are $@"
echo "$1 -- $2 -- $3 -- $4 -- $5 -- $6 -- $7 -- $8 -- $9 -- $10"
echo "Correct parameter 10 is ${10}"
행동 중
$ ./script one two three four five six seven eight nine ten
My arguments are one two three four five six seven eight nine ten
one -- two -- three -- four -- five -- six -- seven -- eight -- nine -- one0
Correct parameter 10 is ten
배쉬 참조 매뉴얼3.4 쉘 매개변수