하위 문자열을 문자열에 열로 추가하는 방법

하위 문자열을 문자열에 열로 추가하는 방법

제목이 문제를 설명하는 데 가장 적합하지 않을 수도 있지만, 내가 하려는 작업을 계속해서 설명하는 것이 내가 생각해 낼 수 있는 최선입니다. 저는 artix runit을 OS로 사용하여 다음에 대한 심볼릭 링크를 만듭니다. 서비스이므로 더 쉽게 만들기 위해 이 스크립트를 만들었습니다.

#!/bin/sh

rundir="/run/runit/service"
svdir="/etc/runit/sv"

for SERVICE in $(ls $svdir); do
    [[ -d "$rundir/$SERVICE" ]] && output="$output$SERVICE        linked: yes\n" || output="$output$SERVICE        linked: no\n"
done

service=$(printf "$output" | dmenu -l 10) || exit 1

if printf "$service" | grep -Fqe "linked: yes"; then
    service=$(printf "$service" | awk '{print $1}')
    sudo -A rm "$rundir/$service"
else
    service=$(printf "$service" | awk '{print $1}')
    sudo -A ln -s "$svdir/$service" "$rundir/"
fi

활성화할 수 있는 모든 서비스를 확인 /etc/runit/sv하고 존재 여부를 확인하여 이미 활성화되어 있는지 확인합니다. 존재 하는 경우 dmenu 목록 끝에 /run/runit/service추가하고 , 그렇지 않은 경우 서비스 이름이 다양하다는 문제를 추가합니다. 따라서 이를 추가하면 다음과 같은 불일치가 발생합니다. linked: yeslinked: no일관성 없는

보시다시피 서비스 이름에 따라 끝 부분에 텍스트 위치가 바뀌기 때문에 눈에 별로 매력적이지 않아서 해결 방법이 없는지 묻고 싶습니다. 문제를 해결할 수 있으므로 처음에 추가하겠지만 linked: xxx이것이 최후의 수단입니다. 코드를 작성하는 더 효율적인 방법을 지적하려는 사람이 있다면 그렇게 하십시오. 이것은 나의 첫 번째 bash 스크립트이고 아직 배울 것이 많습니다. 참고: 저는 sh로 대시를 사용하고 있으므로 어떤 종류의 bashism도 사용할 수 없습니다.

답변1

printf를 사용하여 매개변수의 형식을 특정 길이로 지정할 수 있습니다 . 필요에 따라 조정하여 20자 왼쪽 정렬을 선택했습니다.

d 메뉴 스크린샷

코드를 일부 조정하세요.

#!/bin/sh

rundir="/run/runit/service"
svdir="/etc/runit/sv"

cd "$svdir"
result=$(
    for service in *; do
        printf '%-20s linked: %s\n' "$service" $([ -d "$rundir/$service" ] && echo yes || echo no)
    done | dmenu -l 10
) || exit 1

service=$(echo "$result" | awk '{print $1}')
case $result in
    *yes)
        sudo -A rm "$rundir/$service"
        ;;
    *no)
        sudo -A ln -s "$svdir/$service" "$rundir/"
esac

변경 목록:

  • [ expression ]테스트를 위해 [[ ... ]]대시에 표시되지 않음
  • *대신 에 작동하게 하려면 ls하나가 필요해요cd
  • 변수를 제거 $output하고 루프의 출력을 다음으로 파이프합니다.dmenu
  • if-else 대신 Case 문

관련 정보