저는 여러 서버의 여러 사용자에 대한 여러 키 디렉터리가 있는지 확인하는 일반 스크립트를 작성하려고 합니다. 또한 각 사용자의 $HOME 변수를 활용하고 싶습니다.
예를 들어, 이것이 사실이라고 가정합니다:
- 서버 1: jdoe의 홈 디렉터리는 /home/jdoe입니다.
- 서버 2: jdoe의 홈 디렉터리는 /opt/jdoe2입니다.
- 서버 3은 아직 구축되지 않았습니다. 서버가 구축될 때까지 $HOME을 어디에 구축했는지 알 수 없습니다.
- 서버 4: mysql의 홈은 /opt/home/mysql입니다.
다음은 내 상위 목록입니다(가장 중요한 것부터 가장 중요하지 않은 것 순).
$ cat mylist.txt
$HOME/most_impt_dir1
$HOME/most_impt_dir2
$HOME/most_impt_dir3
$HOME/misc
$HOME/junk
...이 사용자가 소유한 가장 중요한 디렉토리를 찾고 싶습니다.
이것이 내가 시도하는 것입니다:
for i in `cat mylist.txt`
do
if [[ -O $i ]] && [[ -d $i ]]; then
echo "found it: $i"
break
else
echo "$i is not it."
fi
done
위의 코드는 실제로 를 확인하기 때문에 내 목록에 있는 어떤 항목에도 작동하지 않습니다 . 내 코드 에서 사용자 변수의 값을 $HOME
사용하려면 어떻게 해야 합니까 ?$HOME
답변1
With envsubst
- 다음과 같은 이유로 for/cat
루프를 루프로 교체합니다 .while/read
#!/bin/bash
while IFS= read -r i
do
if [[ -O $i ]] && [[ -d $i ]]; then
echo "found it: $i"
break
else
echo "$i is not it."
fi
done < <(envsubst < mylist.txt)
당신은 또한 볼 수 있습니다
답변2
$HOME
파일 에서 벗어나 스크립트에서 사용하세요. 예를 들어
$ cat mylist.txt
most_impt_dir1
most_impt_dir2
most_impt_dir3
misc
junk
그 다음에:
while IFS= read -r i;
do
dir=$HOME/$i
if [[ -O $dir ]] ...
...
fi
done < mylist.txt
Bash를 사용하는 경우 또 다른 옵션은 목록을 bash 배열로 유지하고 파일을 가져와 목록을 가져오는 것입니다.
$ cat mylist.txt
dirs=(
"$HOME/most_impt_dir1"
"$HOME/most_impt_dir2"
"$HOME/most_impt_dir3"
"$HOME/misc"
"$HOME/junk"
)
그러면 스크립트는 다음과 같습니다.
source ./mylist.txt
for dir in "${dirs[@]}"
do
if [[ -O $dir ...
...
fi
done