function
내 파일에 사본이 있습니다 .bashrc
. 나는 그것이 무엇을 하는지 안다. X 디렉토리를 추가한다.cd
여기있어:
up()
{
local d=""
limit=$1
for ((i=1 ; i <= limit ; i++))
do
d=$d/..
done
d=$(echo $d | sed 's/^\///')
if [ -z "$d" ]; then
d=..
fi
cd $d
}
그런데 이 세 가지를 나에게 설명해 주실 수 있나요?
d=$d/..
sed 's/^\///'
d=..
이렇게 하면 안 되는 이유:
up()
{
limit=$1
for ((i=1 ; i <= limit ; i++))
do
cd ..
done
}
용법:
<<<>>>~$ up 3
<<<>>>/$
답변1
d=$d/..
/..
변수에 추가된 현재 내용입니다d
.d
아무것도 없이 시작한 다음 첫 번째 반복이 성공하고/..
두 번째 반복/../..
등이 계속됩니다.sed 's/^\///'
첫 번째 것을 제거/
하면 가/../..
됩니다../..
(매개변수 확장을 사용하여 수행할 수 있음d=${d#/}
).d=..
해당 조건의 맥락에서만 의미가 있습니다.if [ -z "$d" ]; then d=.. fi
이렇게 하면
d
이 시점에서 비어 있으면 상위 디렉터리로 리디렉션됩니다. (up
매개변수가 없는 것과 동일합니다cd ..
.)
이 접근 방식은 한 단계에서 (사용자 관점에서) 이전 디렉터리로 돌아갈 수 있는 기능을 cd ..
유지하므로 반복보다 낫습니다 .cd -
이 기능은 다음과 같이 단순화될 수 있습니다.
up() {
local d=..
for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
cd $d
}
이는 우리가 적어도 한 레벨 위로 올라가서 추가하기를 원한다고 가정합니다.n-1/
수준이므로 선행을 제거 하거나 비어 있는지 확인할 필요가 없습니다 $d
.
Athena 사용 jot
( athena-jot
Debian의 패키지):
up() { cd $(jot -b .. -s / "${1:-1}"); }
답변2
그런데 이 세 가지를 나에게 설명해 주실 수 있나요?
d=$d/..
이는 var의 현재 내용을
d
var와 연결/..
하고 다시 할당합니다d
.
최종 결과d
는/../../../..
.sed 's/^///'
게시한 코드에
/
제공된 문자열에서 선행(echo $d)을 제거합니다 . 백슬래시를 피하기 위해 작성하는 것이 더 나을 수도 있습니다.d
sed 's|^/||'
또 다른 옵션(더 빠르고 간단함)은
d=${d#/}
.디=..
..
var 에 문자열을 할당합니다d
.
이는d
최소한하나..
테스트 결과if [ -z "$d" ]; then
vard
가 비어 있는 것으로 표시되는 경우. 이는 sed 명령이 문자를 제거하기 때문에 발생할 수 있습니다d
.
d에서 문자를 제거할 필요가 없으면sed
또는 이 필요하지 않습니다if
.
질문의 코드는 항상 하나 이상의 디렉터리 위로 이동합니다.
더 나은 것
local d
변수가 비어 있는지 확인하는 것만으로도 충분하며 다른 것은 필요하지 않습니다.
그러나 local은 bash 또는 dash와 같은 특정 셸에서만 작동합니다. 구체적으로ksh
(asyash
)에는 명령이 없습니다local
. 보다 이식성이 뛰어난 솔루션은 다음과 같습니다.[ "$KSH_VERSION$YASH_VERSION" ] && typeset c='' d='' i='' || local c='' d='' i=''
구문은
for((
이식 가능하지 않습니다. 다음과 같은 것을 사용하는 것이 더 좋습니다:while [ "$((i+=1))" -lt "$limit" ]; do
강한.
함수의 첫 번째 인수에 지정된 값이 음수 또는 리터럴일 수 있는 경우 함수는 이러한 값을 강력하게 처리할 수 있어야 합니다.
먼저 값을 숫자로만 제한하겠습니다. (저는c
에 사용하겠습니다count
):c=${1%%[!0-9]*}
그런 다음 개수 값을 양수 값으로만 제한합니다.
let "c = (c>0)?c:0"
이 함수는 0 또는 모든 텍스트(오류 없이)를 허용합니다.
up()
{
[ "$KSH_VERSION$YASH_VERSION" ] && typeset c='' d='' i='' || local c='' d='' i=''
c=${1%%[!0-9]*}
c=$(((c>0)?c:0))
while [ "$((i+=1))" -le "$c" ]; do d="$d../"; done
echo \
cd "${d%/}" # Removing the trailing / is not really needed for cd
# but it is nice to know it could be done cleanly.
}
up 2
up 0
up asdf
echo \
기능을 테스트한 후에는 삭제하세요.