저는 다양한 서버의 다양한 사용자에 대한 여러 주요 디렉터리의 존재를 확인하는 일반 스크립트를 작성하려고 합니다. 또한 각 사용자의 $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