bash 스크립트의 find 명령에서 변수와 if/else 결합

bash 스크립트의 find 명령에서 변수와 if/else 결합

사용자에게 입력을 요청한 다음 find 명령을 실행하는 스크립트를 작성 중입니다.

내가 가지고 있는 것은 작동하지만 if/else 구조로 인해 중복된 코드가 많이 있는 것처럼 느껴집니다. 인라인 문을 사용할 수 있나요 if?

따라서 다음과 같은 것 대신에:

if [[ $depth_boolean == y ]] || [[ $depth_boolean == yes ]]
    then
        if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
        then
            find -L $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
        else
            find $location -maxdepth $depth -readable -iname "$query" -$find_type $find_type_option -$find_action
        fi
    else
        if [[ $symlink_boolean == y ]] || [[ $symlink_boolean == yes ]]
        then
            find -L $location -readable -iname "$query" -$find_type $find_type_option -$find_action
        else
            find $location -readable -iname "$query" -$find_type $find_type_option -$find_action
        fi
    fi

이런 일이 가능합니까?

find if [ $symlink_boolean == y ]; then echo "-L";
   fi $location if [ $symlink_boolean == y ]; then 
   echo "-maxdepth $depth"; fi -readable -iname "$query" 
   -$find_type $find_type_option -$find_action

위 방법으로는 안되는데, 가능한지 알고 싶습니다.

답변1

간단한 변수를 사용하여 심볼릭 링크를 처리할 수 있습니다.

symlink_flag=
if [[ $symlink_boolean == y ]]; then
    symlink_flag=-L
fi
find $symlink_flag "$location" -maxdepth "$depth" -readable ...

여기에는 따옴표가 없으므로 $symlink_flag비어 있으면 사라집니다. 해당 값에는 와일드카드나 기본 IFS문자가 포함되어 있지 않으므로 인용하지 않아도 아무런 해가 없습니다. 예를 들어 위치에 공백이 포함될 수 있으므로 다른 변수는 따옴표로 묶어야 합니다.

심층적인 부분의 경우 가장 좋은 옵션은 배열에 명령줄을 작성하는 것입니다.

arguments=()
if [[ $symlink_boolean == y ]]; then
    arguments+=(-L)
fi
arguments+=("$location")
if [[ $depth_boolean == y ]]; then
    arguments+=(-maxdepth "$depth")
fi
find "${arguments[@]}" -readable -iname ...

위와 같이 변경되지 않은 옵션을 find명령줄에 넣을 수도 있고, 무조건 배열에 추가하고 를 실행할 수도 있습니다 find "${arguments[@]}".

또한보십시오:


기술적으로는 명령 대체를 통해 제안한 작업을 수행할 수도 있습니다.

find $(if [[ $symlink_boolean == y ]]; then printf %s -L; fi) "$location"
    $(if [[ $depth_boolean == y ]]; then echo -maxdepth $maxdepth; fi) ...

이것이 일반적으로 최적은 아니지만 명령 대체에서 여러 단어를 생성하는 유일한 방법은 공백으로 구분한 다음 분할하는 것입니다. 하지만 공백을 포함해야 하는 단어가 있으면 이 방법도 제대로 작동하지 않습니다. 하지만 작동해야합니다.-maxdepth N


참고로, [[ $symlink_boolean == [Yy]* ]]예를 들어 다음을 사용하여 조건을 약간 압축할 수 있습니다. 변수가 Ya 또는 a로 시작하는지 확인합니다 y. (실제 값과 같은 것을 신경 쓰지 않는다면 YEAAHHH) 정규식을 사용하여 해당 두 값만 일치시키 [[ $symlink_boolean =~ ^(y|yes)$ ]]거나 허용하십시오.case $symlink_boolean in y|yes) echo "true";; esac

관련 정보