모든 정크(캐시, 이전 iPhone 백업, 로그 등)를 제외하면서 OS X에서 사용자 폴더를 빠르게 복사하기 위한 복사 스크립트를 만들려고 합니다. 해당 파일/폴더를 복사하지 않는 한 문제가 없습니다. 문제는 사용자를 선택할 때입니다. 시스템 계정을 제외한 컴퓨터의 모든 사용자 목록을 작성하고 운영자가 목록에서 숫자를 입력하여 백업할 사용자 폴더를 선택하도록 하고 싶습니다. 현재 다음 명령을 사용하여 사용자를 얻을 수 있습니다.
userList=`dscl . list /Users UniqueID | awk '$2 >= 400 { print $1; }'`
예를 들어 다음과 같이 반환됩니다.
hiddenadmin fred joe kim
다음을 표시하는 선택 목록을 만들고 싶습니다.
Please choose which user folder you would like to copy:
1) hiddenadmin
2) fred
3) joe
4) kim
사용자가 있으면 괜찮지만 목록을 만들 수 없는 것 같습니다. 또한, 이름이 동일할 것이라는 보장도 없으며, 심지어 사용자 수가 동일할 것이라는 보장도 없습니다.
목록을 생성하기 위해 /Users 폴더만 살펴보지 않는 이유가 궁금하신가요? 일부 계정은 숨겨져 있고 해당 사용자 폴더가 다른 곳에 있을 수 있으며 목록에 Guest
또는 폴더가 있는 것을 원하지 않습니다 . Shared
여기서 문제는 이 문제를 어디서부터 시작해야 할지조차 모른다는 것입니다.
답변1
있다많이당신이 요청한 것을 수행하는 방법. 여기 내 빠르고 더러운 내용이 있습니다.
변수에 이미 사용자가 있으므로 for
형식 지정을 수행하려면 루프가 필요합니다. 내 예를 위해 귀하의 값을 사용하겠습니다. T
userList="hiddenadmin fred joe kim"
echo "Please choose which user folder you would like to copy:"
count=0
for name in $userList;do
count=$((count+1))
printf '\t%s) %s\n' $count $name
echo
done
read -p "Choose from $(eval echo {1..$count}): " CHOICE
이 루프는 을 읽고 userList
, 카운터를 초기화하고 printf
출력에 사용합니다. \t
선택한 내용을 들여쓰고 CRLF \n
를 보냅니다.
메뉴 옵션이 인쇄되면 read
명령은 사용자에게 입력하라는 메시지를 표시하고 선택 항목을 변수로 설정합니다 CHOICE
. 옵션 count
내에서 변수를 재사용하여 유효한 선택 사항을 표시할 수 있습니다. 입력의 유효성을 검사하려면 몇 가지 추가 코드를 추가해야 합니다. 간단한 문장으로 그렇게 할 수 있습니다 .-p
read
case
case $choice in
1) #some code
;;
2) #some code
;;
*) echo "Invalid choice"
;;
esac