if 문을 사용하여 변수를 호출하면 -bash: 'Command not find'가 발생합니다.

if 문을 사용하여 변수를 호출하면 -bash: 'Command not find'가 발생합니다.

.bash_profileipy를 실행할 때 7일 이상마다 로그 파일이 지워지도록 파일을 수정하고 있습니다 . 문제는 if 문에서 변수를 참조할 때마다 return 이 반환된다는 것입니다 -bash: command not found.

  1 #!/bin/sh
  2 # .bash_profile
  ...
 15 # These lines clear the ipy.log every seven or more days
 16 PREV=$(awk '/./{line=$0} END{print line}' days.log)
 17 echo $PREV
 18 WEEKDAY=$(date '+%Y%m%d')
 19 echo $WEEKDAY
 20 DIF=$((WEEKDAY-PREV))
 21 MARKER=false
 22 if [ ${DIF} > 6 ]; then
 23     YEAR=$(date '+%Y')
 24     MON=$(date '+%m')
 25     DAY=$(date '+%d')
 26     DIGIT=${DAY:-1}
 27     if [ ${DIGIT} -eq 1 ]; then
 28         TAG='st'
 29     elif [ ${DIGIT} -eq 2 ]; then
 30         TAG='nd'
 31     elif [ ${DIGIT} -eq 3 ]; then
 32         TAG='rd'
 33     else
 34         TAG='th'
 35     fi
 36     TIMESTAMP=$(date '+%H:%M:%S')
 37     MARKER=true
 38     PRINT=$("ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}")
 39     echo ${PRINT}
 40     ${PRINT} > ~/ipy.log
 41     ${WEEKDAY} > ~/days.log
 42 else
 43     echo "It has been ${DIF} days since your last write, no need to clear logs"
 44 fi

산출:


20200216
-bash: ipy.log was cleared at 14:35:45 on 20200216 the 16th  of  02,  2020: command not found

-bash: 20200216: command not found

파일의 마지막 줄을 호출하여 days.log변수에 할당 하면 $PREVnull에만 할당된다는 점을 알 수 있을 것입니다. 그러나 이 문제는 다른 게시물에서 공식적으로 다루겠습니다. 나는 command not found이러한 진술이 어떻게, 왜 이루어졌는지 알고 싶습니다 .

답변1

15번째 줄에서는 다음을 수행합니다.

WEEKDAY=$(date '+%Y%m%d')

따라서 WEEKDAY == "20200216" 또는 이와 유사합니다. 41번째 줄에서는 다음을 수행합니다.

${WEEKDAY} > ~/days.log

${WEEKDAY}"20200216"으로 대체됩니다 . Bash에서 제공하는 첫 번째 문자열은 항상 명령입니다(키워드, 할당 및 기타 항목은 제외하지만 지금은 잊어도 됩니다). 따라서 bash다음을 실행하려고 시도합니다.

20200216

이것은 존재하지 않습니다. 다음과 같이 작성하고 싶을 수도 있습니다.

echo "${WEEKDAY}" > ~/days.log

대신에.

답변2

20번째 줄 "DIF=$((WEEKDAY-PREV))"에서 산술을 사용하고 있으므로 22번째 줄에서 읽는 것이 가장 좋은 방법이라고 생각합니다.

22 if [ ${DIF} -gt 6 ]; then

또한 이전에 Tomáš Pospíšek이 말했듯이 40행과 41행에서는 변수 앞에 명령이 필요하므로 다음을 읽어야 합니다.

40 echo "${PRINT}" > ~/ipy.log
41 echo "${WEEKDAY}" > ~/days.log

답변3

다음 줄은 의미가 없습니다.

PRINT=$("ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}")

문법 $(...)주문하다교체되었으므로 bash다음을 실행해 보십시오.

ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}

명령으로.

대신 다음을 수행할 수 있습니다.

  • 변수를 PRINT문자열로 설정합니다.
PRINT="ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG}  of  ${MON},  ${YEAR}"
  • echo터미널에 대한 문자열:
echo "$PRINT"
  • echo파일에 대한 문자열:
echo "$PRINT" > ~/ipy.log

파일이 이미 존재하지만 다음 오류로 인해 비어 있기 때문에 파일 할당이 PREV예상대로 작동하지 않습니다 .~/days.log

${WEEKDAY} > ~/days.log

이것은 아마도 다음과 같습니다:

echo "$WEEKDAY" > ~/days.log

다음은 약간 다른 접근 방식입니다.

# This function clears ipy.log every seven or more days
function clear_ipylog() {
    typeset -i prev yearmday dif
    typeset tag timedate message
    typeset -g marker
#     read -r prev <"$HOME/days.log" # Should work instead of awk as days.log should only contain '%Y%m%d'
    prev=$(awk '/./{line=$0} END{print line}' "$HOME/days.log")
    echo $prev >&2
    yearmday=$(date '+%Y%m%d')
    echo $yearmday >&2
    dif=$((yearmday-prev))
    if [ $dif -gt 6 ]; then
        case ${yearmday:6:2} in
            (01) tag='st' ;;
            (02) tag='nd' ;;
            (03) tag='rd' ;;
            (*) tag='th' ;;
        esac
        timedate=$(date '+%H:%M:%S %F%b')
        message=$(printf '%s %d%s\n' "ipy.log was cleared at ${timedate:0:19}, the" \
            "${yearmday:6:2}" "$tag of ${timedate:19} ${yearmday:0:4}")
        echo "$message" > "$HOME/ipy.log"
        echo "$message" >&2
        echo $yearmday > "$HOME/days.log"
        marker='true'
    else
        echo "It has been $dif days since your last write, no need to clear logs"
        marker='false'
    fi
}
clear_ipylog
  • 이는 함수 내에서 일부 변수를 분리하는 것입니다. 등을 전역 변수로 설정 하고 싶지 않다고 가정합니다 $prev.$dif
  • 그것이 무엇인지 확실하지 않으므로 $marker전역 변수로 설정한다고 가정합니다.
  • ~/.bash_profile, ~/.bashrc직접 읽으 bash므로 이 줄로 시작 #!/bin/sh하거나 실행 모드를 설정 하면 안 됩니다.
  • 첫 번째 행/필드에서 가져올 수 있도록 ~/days.log첫 번째 행의 형식을 변경하여 더 이상 사용되지 않게 만드는 것을 고려할 수 있습니다.~/ipy.logprevipy.log

관련 정보