사용자에게 입력을 요청한 다음 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]* ]]
예를 들어 다음을 사용하여 조건을 약간 압축할 수 있습니다. 변수가 Y
a 또는 a로 시작하는지 확인합니다 y
. (실제 값과 같은 것을 신경 쓰지 않는다면 YEAAHHH
) 정규식을 사용하여 해당 두 값만 일치시키 [[ $symlink_boolean =~ ^(y|yes)$ ]]
거나 허용하십시오.case $symlink_boolean in y|yes) echo "true";; esac