쉘 변수에 절대 경로가 포함되어 있는지 확인하고 싶습니다.
경로가 존재하는지 여부는 상관하지 않습니다. 존재하지 않으면 경로를 생성합니다. 하지만 절대 경로 이름을 다루고 있는지 확인하고 싶습니다.
내 코드는 다음과 같습니다
myfunction() {
[ magic test to see if "$1" is an absolute path ] || return 1
mkdir -p "$(dirname "$1")" || return 1
commands >> "$1"
}
또는 확인할 절대 경로가 디렉터리인 사용 사례:
anotherfunction() {
[ same magic test ] || return 1
mkdir -p "$1"
dostuff >> "$1/somefile"
}
그렇다면 awk
다음과 같이 확인해 보겠습니다.myvar ~ /^\//
거기~ 해야 하다셸의 문자열 처리를 통해 이 작업을 수행하는 깔끔한 방법이지만 알아내는 데 문제가 있습니다.
( bash
특정 솔루션을 언급하는 것도 좋지만 이식 가능한 방법도 알고 싶습니다. POSIX 문자열 처리만으로 충분할 것 같습니다.)
답변1
다음을 수행할 수 있습니다.
case $1 in (/*) pathchk -- "$1";; (*) ! : ;; esac
그 정도면 충분합니다. 진단 정보를 stderr에 기록하고 액세스할 수 없거나 생성할 수 없는 구성 요소에 대한 오류를 반환합니다.pathchk
대해가 아니라기존의경로명 - 이것에 관한 것입니다쓸 수 있는경로명.
이
pathchk
유틸리티는 하나 이상의 경로 이름이 유효한지 확인해야 합니다.(즉, 구문 오류 없이 파일에 액세스하거나 생성하는 데 사용할 수 있습니다)그리고 휴대용(즉, 파일 이름 잘림 결과가 없습니다). 이-p
옵션은 보다 광범위한 이식성 검사를 제공합니다.기본적으로
pathchk
유틸리티는 모든 구성 요소를 확인해야 합니다.pathname
기본 파일 시스템을 기반으로 하는 피연산자입니다. 진단서는 각각에 대해 작성되어야 합니다.pathname
피연산자:
{PATH_MAX}
바이트보다 길다(경로 이름 변수 값 참조 <제한사항.h>)
{NAME_MAX}
바이트보다 긴 구성 요소가 위치한 디렉터리에 포함되어 있습니다.디렉터리에는 검색할 수 없는 구성 요소가 포함되어 있습니다.
모든 구성 요소에는 포함된 디렉터리에서 유효하지 않은 문자가 포함되어 있습니다.
진단 메시지의 형식은 지정되지 않지만 감지된 오류와 해당 오류를 표시해야 합니다.
pathname
피연산자.구성 요소 중 하나 이상의 구성 요소를 오류로 간주해서는 안 되는 경우
pathname
파일이 일치하는 한 피연산자는 존재하지 않습니다.pathname
위에 지정된 검사를 위반하지 않는 누락된 구성 요소로 지정된 구성 요소를 생성할 수 있습니다.
답변2
[ "$1" != "${1#/}" ] || return 1
아마도 더 좋은 방법이 있을 것입니다(그래서 제가 묻는 것입니다). 이 코드는 모든 선행을 제거 /
하고 $1
결과가 다음과 같은지 확인합니다.아니요그 자체처럼 $1
.
답변3
패턴 일치는 case
모든 Bourne 유사 쉘의 명령문을 통해 수행됩니다.
is_absolute() { 케이스 '$1' ///* | //) 사실;; //*) 잘못된;; #일부 시스템에서는 //foo가 특별합니다.그리고는 # 절대 경로가 아닙니다. //유일한 것은/ /*) 진짜;; *) 잘못된 이삭 }
특별한 처리 없이 시스템의 처음 두 항목을 제거합니다 //foo
.
답변4
통과되면절대 경로로 시작한다는 뜻입니다. 우리는 (레이블에서 알 수 있듯이) 다음과 같이 /
논의하고 있습니다 .bash
$ var1='/tmp/foo'
$ var2='tmp/foo'
$ [[ "$var1" =~ ^/ ]] && echo yes || echo no
yes
$ [[ "$var2" =~ ^/ ]] && echo yes || echo no
no