$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

관련 정보