목록에 있는 하나 이상의 개체 처리 [닫기]

목록에 있는 하나 이상의 개체 처리 [닫기]

이름에 공백이 있는 개체를 찾아 각 공백을 밑줄로 바꾸는 스크립트를 작성했습니다. 개체 유형은 개별 개체를 기준으로 선택됩니다.
대안으로, 모든 객체 유형을 어떻게 처리할 수 있습니까? 아마도 if-then-else와 내부 for 루프를 생각하고 있나요?

#!/bin/sh
printf "Choose object from the list below\n"
printf "**policy**\n**ipadd**r\n**subnet**\n**netmap**\n**netgroup**\n
**host**\n**iprange**\n**zonegroup**\n" | tee object.txt

read object
IFS="`printf '\n\t'`"
#   Find all selected object names that contain spaces
cf -TJK name "$object" q | tail -n +3 |sed 's/ *$//' |grep " " >temp
for x in `cat temp`
do
#   Assign the y variable to the new name
y=`printf "$x" | tr ' ' '_'`
#   Rename the object using underscores
cf "$object" modify name="$x" newname="$y"
done

답변1

사용자에게 메뉴를 표시하려면 다음 select명령을 고려하십시오.

#  Ask the user which object type they would like to rename
objects=( policy netgroup zonegroup host iprange ipaddr subnet netmap )
PS3="Which network object type would you like to edit? "

select object in "${objects[@]}" all; do
    [[ -n "$object" ]] && break
done

if [[ "$object" == "all" ]]; then
    # comma separated list of all objects
    object=$( IFS=,; echo "${objects[*]}" )
fi

cf -TJK name "$object" q | etc etc etc
# ...........^ get into the habit of quoting your variables.

나는 가정한다여기. 사용 중인 쉘이 아닌 경우 알려주시기 바랍니다.


배열이 없는 셸에 갇혀 있는 경우 객체는 간단한 단어이기 때문에 이렇게 할 수 있습니다.

objects="policy netgroup zonegroup host iprange ipaddr subnet netmap"
PS3="Which network object type would you like to edit? "

select object in $objects all; do     # $objects is specifically not quoted here ...
    [ -n "$object" ] && break
done

if [ "$object" = "all" ]; then
    object=$( set -- $objects; IFS=,; echo "$*" )        # ... or here
fi

cf -TJK name "$object" q | etc etc etc

관련 정보