저는 Red Hat을 사용하고 있습니다.
세 개의 이름을 조합하여 디렉토리를 만들려고 합니다.
다음과 같은 속성 파일이 있습니다.
build_name = MyBuild
build_no = 100
appServer_version = jboss6.1`
이 속성 파일을 읽고 세 이름을 모두 결합하여 디렉터리를 만들려고 했습니다. 디렉토리가 생성되면 다음과 같아야 합니다.
MYBuild-100-jboss6.1
내가 시도한 것은 다음과 같습니다.
file="./app.properties"
if [ -f "$file" ]
then
echo "$file found."
while IFS='=' read -r key value
do
key=$(echo $key | tr '.' '_')
eval "${key}='${value}'"
done < "$file"
echo "build_name = " ${build_name}
echo "build_no = " ${build_no}
echo "Jboss_version = "${jboss_version}
echo "Got the value from property file"
name=${build_name}-
build=${build_no}-
Jboss=${jboss_version}
fileName="${name}${build}${Jboss}"
mkdir $fileName
else
echo "$file not found."
fi
이것을 실행하면 항상 MyBuild
, 100
, 라는 세 개의 서로 다른 디렉토리가 생성됩니다 jboss6.1
. 무엇이 잘못됐나요?
업데이트 1
file="./app.properties"
ARRAY=()
if [ -f "$file" ]
then
echo "$file found."
IFS='='
while read -r key value
do
val=$(echo "$value" | tr -d '[[:space:]]')
ARRAY+=("$val")
done < "$file"
IFS='-'
newdir="${ARRAY[*]}"
echo "mkdir $newdir"
if[ -f "$newdir" ]
then
echo "$newdir allready exist."
rm -rf $newdir
mkdir "$newdir"
else
mkdir "$newdir"
else
echo "$file not found."
fi
답변1
read
두 가지 문제가 있습니다. 첫 번째는 을 사용할 때 변수에 남은 공간입니다 IFS='='
. 둘째, jboss_version
실제로 응용 프로그램 파일에 해당 내용이 없습니다. 한 가지 방법은 다음과 같습니다.
file="./app.properties"
if [ -f "$file" ]
then
echo "$file found."
while IFS='=' read -r key value
do
key=$(echo $key | tr '.' '_' | tr -d ' ' | tr -d '\t')
val=$(echo $value | tr -d ' ' | tr -d '\t')
eval "${key}='${val}'"
done < "$file"
echo "build_name = " ${build_name}
echo "build_no = " ${build_no}
echo "Jboss_version = "${appServer_version}
echo "Got the value from property file"
name=${build_name}-
build=${build_no}-
Jboss=${appServer_version}
fileName="${name}${build}${Jboss}"
echo mkdir [$fileName]
else
echo "$file not found."
fi
그러나 나는 다르게 할 것입니다. 또한 IFS
분할 및 연결에 강제로 사용하여 app.properties
파일의 모든 변수를 사용합니다.
file="./app.properties"
ARRAY=()
if [ -f "$file" ]
then
echo "$file found."
IFS='='
while read -r key value
do
val=$(echo "$value" | tr -d '[[:space:]]')
ARRAY+=("$val")
done < "$file"
IFS='-'
newdir="${ARRAY[*]}"
if [ -d "$newdir" ]; then
echo "rm -rf $newdir"
rm -rf "$newdir"
fi
echo "mkdir $newdir"
mkdir "$newdir"
else
echo "$file not found."
fi
답변2
스크립트에는 여러 가지 문제가 있으며 완전히 다시 작성하지 않고 다음을 수행해야 합니다.
value
공백을 제거하세요- JbossVersion 대신 입력 파일에서와 같이 스크립트에서 appServer_version을 사용하십시오.
피복재:
file="./app.properties"
if [ -f "$file" ]
then
echo "$file found."
while IFS='=' read -r key value
do
key=$(echo $key | tr '.' '_')
value=$(echo $value | sed 's/ //g')
eval "${key}='${value}'"
done < "$file"
echo "build_name = " ${build_name}
echo "build_no = " ${build_no}
echo "Jboss_version = "${appServer_version}
echo "Got the value from property file"
name=${build_name}-
build=${build_no}-
Jboss=${appServer_version}
fileName="${name}${build}${Jboss}"
echo $fileName
# mkdir $fileName
else
echo "$file not found."
fi
답변3
# 주석 또는 app.properties #!/bin/bash에서 일부 정크를 건너뛰세요.
FILE="./app.properties"
SEP=
FILENAME=
while read -r LINE; do
LINE=$(echo ${LINE} | sed -rn -e '/=/{/#.*/d;s/[^=]+=([^=]+).*/\1/;s/[ ]*//gp}' )
[[ -n ${LINE} ]] && FILENAME+=${SEP}${LINE} && [[ -z ${SEP} ]] && SEP="-"
done <"$FILE"
echo $FILENAME
#mkdir $FILENAME