내 코드에서 $HOME 변수의 값을 사용하도록 하려면 어떻게 해야 합니까?

내 코드에서 $HOME 변수의 값을 사용하도록 하려면 어떻게 해야 합니까?

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

관련 정보