명령줄 인수에 영향을 주지 않고 여전히 해당 인수 내에 있도록 $VAR을 비워 두려면 어떻게 해야 합니까?

명령줄 인수에 영향을 주지 않고 여전히 해당 인수 내에 있도록 $VAR을 비워 두려면 어떻게 해야 합니까?

이것은 hsetroot가 작동하기 위한 기본 설정입니다: hsetroot -center /path/to/image/ - 이미지만 사용하여 배경 화면을 설정합니다. 이러한 옵션을 사용하려면 세 가지 옵션 중 하나만 사용하여 동일한 인수 줄에 옵션을 배치하면 됩니다. -flipd, -fliph, -flipv는 hsetroot를 설정할 때 사용할 수 있는 총 4가지 옵션을 제공하므로 옵션 중 하나가 "void"이거나 존재하지 않습니다.

따라서 네 가지 옵션을 모두 사용할 수 있으려면 프로그램 호출에 배치해야 하는 $variable은 시스템이 볼 수 없도록 "사라져야" 하고, $var는 여전히 스크립트의 매개변수에 배치됩니다. 부르다.

사례 설명은 이 작업에 적합합니다. RANDOM에게 4개의 숫자 중 하나를 요청하면 Case 문이 하나를 선택하거나 해당 숫자가 대소문자와 일치하여 hestroot의 매개변수 행에 설정됩니다.

형식은 hsetroot -flipd -center /path/to/image입니다. -- 옵션을 수동으로 변경하는 수고를 대체하려면 간단히 $var를 사용한 다음 함수에서 동일한 $var를 다시 할당하면 됩니다. 스크립트를 작성하고 다른 방식으로 다시 작성해 보세요. 이제 사용자에게 제공된 네 가지 옵션 모두 대신 이 변수를 사용하여 다음과 같이 hsetroot를 설정할 수 있습니다. hsetroot $var -center /path/to/image

여기서 $var는 이제 1) -fliph , 2) -flipd , 3) ​​​​-flipv 및 4) 네 번째 또는 마지막 옵션 중 하나가 됩니다.

휴스턴, 이제 문제가 생겼습니다!

스크립트를 열고 수동으로 변경할 필요가 없기 때문에 해당 코드 줄에 작성된 $var가 더 이상 존재하지 않는다고 시스템이 믿도록 해야 합니다. 오류 없이 실행될 수 있도록 필요한 모든 매개변수를 찾는 프로그램에 영향을 주지 않도록 사라지거나 보이지 않게 되어야 합니다.

우리는 무엇을 해야 합니까?

다시 말해서:

4가지 옵션이 있는 사례 설명이 있는데, 그 중 하나는 존재하지 않음을 나타내기 위해 "비어 있어야" 합니다. 그것은 다음과 같이 진행됩니다: 제가 겪고 있는 문제는 $변수가 매개변수 줄 안에 남아 있어야 하기 때문에 "0"인 경우입니다. 그러나 RANDOM이 변수에 0 값(0)을 할당하면 "사라져야 합니다" " 마치 존재하지 않는 것처럼 프로그램이 다른 모든 매개변수를 사용하여 수행하는 작업을 수행할 수 있습니다. 모두 시도해 볼 준비가 되었습니다.

setS="" and setS='' and setS="NULL" and unset -v setS

그들 중 누구도 일하지 않아

flipS()
{
 RANGE=3
 val=$RANDOM
 let  "val %= $RANGE"

 case $val in 
    1 )
        setS="-flipd"
          echo "$setS 1"
        ;;
    2 )

        setS="-fliph"
          echo "$setS 2"
            ;;
    3 )

        setS="-flipv"
          echo "$setS  -- 3"
            ;;
    0 )

         setS=' '
           echo "$setS   -- 4"
            ;;
esac
}
 flipS 

이것은 화면 설정을 무작위로 지정하는 hsetroot의 구문입니다: hsetroot [command1 [arg1..]] [command2 [arg1..]]... with -flipv 등. 뒤에는 arg가 오지 않습니다. 그냥 그 자체 안에 넣으세요.

참고: 저는 hsetroot의 거의 모든 매개변수를 무작위로 사용하므로 다음과 같은 Case 문을 사용하는 것은 옵션이 아닙니다.

 RANGE=3
 val=$RANDOM
 let  "val %= $RANGE"

   cast $val in
  1 )
   hsetroot -flipd -center /path/to/image
   ;;
  2 )
   hsetroot -flipv -center /path/to/image
    ;;
  .......

답변1

  1. 4가지 경우(0,1,2,3)를 원하면 다음이 필요합니다.RANGE=4

  2. 단순화하다:

    flipS() {
        local options=("" "-fliph" "-flipd" "-flipv")
        local index=$(( RANDOM % ${#options[@]} ))
        setS=${options[$index]}
    }
    
  3. setS빈 문자열인 경우 명령이 이를 볼 수 없는 방식으로 명령을 사용 하려면 변수를 참조하면 안 됩니다.

    hsetroot $setS -anotheroption ...
    

관련 정보