마지막 인수를 제외한 모든 인수/인수를 반복하는 쉘 스크립트를 만들고 싶습니다. 이것이 내가 지금까지 가지고 있는 것입니다:
for i in $@
do
echo "$i"
done
이는 ./script.sh 명령 이후의 모든 인수를 표시하는 데 효과적이지만 마지막 인수 또는 내가 선택한 인수를 무시할 수 있는 방법이 있었으면 좋겠습니다(예: 하나인 경우 항상 세 번째 인수 무시). . 분명히 말하면 지금은 마지막 인수/매개변수가 더 걱정됩니다.
저는 스크립팅이 처음이므로 이 답변이 포함된 다른 게시물이 있으면 사과드립니다. 나는 어떤 것에 새로운 것이 있다는 것은 일반적으로 당신이 찾고 있는 것을 적절하게 요청하는 방법을 모른다는 것을 의미한다는 것을 발견했습니다.
어떤 도움이라도 대단히 감사하겠습니다!
답변1
매개변수를 유지할 필요가 없는 경우
while (( $# > 1 ))
do
echo "$1"
shift
done
위치 매개변수를 변경하지 않고 유지하려면 개수를 유지하면 됩니다.
SKIP=$#
let x=1
for i
do
if (( x != SKIP ))
then
echo "$i"
fi
let x=x+1
done
답변2
CentOS에는 Bash가 있을 수 있으므로 이를 사용할 수 있으면 배열의 일부를 실행할 수 있습니다.
for x in "${@:1:$# - 1}" ; do
echo do something with "$x"
done
${@:n:m}
상징m
number 에서 시작하는 위치 매개변수를 가져옵니다 n
. 우리는 총 수를 취하고 $#
마지막 매개 변수를 무시하기 위해 1을 뺍니다. 오프셋과 길이는 에서와 같이 산술 표현식으로 처리되므로 $((...))
Stéphane이 아래에 설명했듯이 거기에서 산술을 수행할 수 있습니다. 배열 인덱싱은 일반적으로 0부터 시작하지만 $@
0부터 시작하는 경우에는 $0
in에서 쉘 이름이 도입되는데 이는 우리가 원하는 것이 아닙니다.
인수가 더 이상 분할되지 않도록 $@
or 표현식을 인용할 가능성이 높습니다 .${@:n:m}
답변3
skip_last() {
p=$1; shift
for i
do
set ${1+"$@"} "$p"; p=$1; shift
done
for i
do
# do something with i when i != last now
echo "$i"
done
}
# and then...
skip_last "a" "b" "c" "d" "e"