나는 그것을 사용하고 있다데비안 10(Buster) 간단한 Bash 스크립트에서 오류가 발생했습니다. 그것이 하는 일은 인수가 전달되었는지 확인하는 것뿐입니다. 파일인 경우 해당 파일을 에코하면 됩니다.
#!/usr/bin/bash
if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then
echo "$1"
fi
exit 1
다음 오류가 발생합니다.
line 2: syntax error near unexpected token `'$#''
line 2: `if [ ( '$#' -eq 1 ) && ( -f "$1" ) ]; then'
나는 주변 따옴표(", ', 따옴표 없음)의 모든 조합을 시도했지만 $#
항상 내가 사용하는 따옴표 유형에 따라 이러한 오류 메시지의 변형이 나타납니다. 무엇을 찾고 있는지 알 수 없습니다.
답변1
여기에는 두 가지 문제가 있습니다. 첫째, 간단한 [
내장 함수는 포함될 수 없습니다 &&
. 여러 조건을 결합하려면 다음 중 하나 이상이 필요합니다 [
.
if [ "$#" -eq 1 ] && [ -f "$1" ]; then
$#
둘째, 확장해야 하기 때문에 작은따옴표를 사용할 수 없습니다 . 귀하의 버전은 '$#' -eq 1
다음과 함께 작동합니다.끈 $#
1위로.
bash 키워드를 사용하면 모든 것이 훨씬 간단해집니다 [[
.
if [[ "$#" -eq 1 && -f "$1" ]]; then
답변2
[
명령이므로 실제로 문제는 여러 조건을 사용하려는 방식입니다. 당신은 이것을 원합니다 :
if [ "$#" -eq 1 ] && [ -f "$1" ]; then
답변3
다른 답변에서는 스크립트 수정 방법을 설명하지만 기술적으로 오류가 무엇인지 알고 싶습니다. 명령의 단어를 인용 해제하고 이스케이프하지 않도록 허용하는 bash의 유일한 유효한 구문은 (
함수를 정의할 때라고 생각합니다. 그래서 bash는 그것을 보고 (
즉시 그것이 이라는 함수의 정의임에 틀림없다고 생각합니다 . 그러나 당신은 단지 을 기대하는 bash를 [
따르기 때문에 구문 오류가 발생합니다. 함수 정의가 아니라면 그 의미가 무엇인지 누가 알겠습니까? 그 이후에는 동일한 구문 오류가 발생합니다.'$#'
)
(
)
$ echo ( foo )
bash: syntax error near unexpected token `foo'
다음에 나오는 내용을 제거 (
하고 함수 정의 구문을 따르지 않으면 다음과 같은 결과가 나타납니다.
$ [ ( ) ( -f "$1" )
마지막으로 함수가 정의됩니다 [
.
$ [
bash: -f: command not found