사용자 정의 정보를 입력할 수 있는 [][][][]$
다음 과 같은 사용자 정의 명령 프롬프트를 만들려고 합니다 . []
예를 들어 콘솔에 쓰면 . file.sh 0 2 "date -R"
명령 프롬프트가 이렇게 나오네요. [Sat, 29 Aug 2020 11:02:40 +0200][][][]$
0은 위치를 나타내고 2는 값의 종류를 나타냅니다(1은 문자열, 이 경우 2는 명령, 3은 csv 파일) 기본적으로 , 명령 프롬프트를 동적으로 만들고 싶으므로 Enter 키를 누를 때마다 값이 업데이트되어야 합니다(문자열이 항상 동일하게 유지되거나 csv 열과 같이 모든 값을 업데이트할 필요는 없습니다). 예를 들어, Enter 키를 눌렀을 때 프롬프트를 에서 로 변경하고 싶습니다 [Sat, 29 Aug 2020 11:02:40 +0200][][][]$
. [Sat, 29 Aug 2020 11:02:45 +0200][][][]$
이것은 내 완전한 코드입니다.
#!/bin/bash
updatedata() {
v=$(awk -v strSearch="$1" '
BEGIN{
FS=";"
}
{
gsub(/\r/,"")
for(i=1;i<=NF;i++){
if($i==strSearch){ print i
exit
}
}
}
' data.csv)
sum=0
for x in `cut -f $v -d ';' data.csv`
do
x="${x/$'\r'/}"
let sum=$sum+$x
done
if [ $pos -eq 0 ]
then
v0=$sum
elif [ $pos -eq 1 ]
then
v1=$sum
elif [ $pos -eq 2 ]
then
v2=$sum
elif [ $pos -eq 3 ]
then
v3=$sum
fi
}
while [ "$#" -gt 0 ]; do
pos=$1
typevar=$2
stringvar=$3
case $pos in
0) v0=$3 ;;
1) v1=$3 ;;
2) v2=$3 ;;
3) v3=$3 ;;
*) echo "One of the values has invalid position entered, try again"
esac
case $typevar in
1) if [ $pos -eq 0 ]
then
if [ "$stringvar" != "null" ]
then
v0=$stringvar
else
v0=""
fi
elif [ $pos -eq 1 ]
then
if [ "$stringvar" != "null" ]
then
v1=$stringvar
else
v1=""
fi
elif [ $pos -eq 2 ]
then
if [ "$stringvar" != "null" ]
then
v2=$stringvar
else
v2=""
fi
elif [ $pos -eq 3 ]
then
if [ "$stringvar" != "null" ]
then
v3=$stringvar
else
v3=""
fi
fi ;;
2) if [ $pos -eq 0 ]
then
v0=`eval $3`
elif [ $pos -eq 1 ]
then
v1=`eval $3`
elif [ $pos -eq 2 ]
then
v2=`eval $3`
elif [ $pos -eq 3 ]
then
v3=`eval $3`
fi ;;
3) updatedata $3 ;;
*) echo "Invalid type of variable, try again"
esac
shift
shift
shift
done
export PS1="[$v0][$v1][$v2][$v3]$"
PS1의 내보내기를 사용해 보았으나 성공하지 못했습니다. 나는 또한 다음과 같이 PS1에 작은따옴표를 사용해 보았습니다. export PS1='[$v0][$v1][$v2][$v3]$'
그러나 그것도 작동하지 않았습니다. 나는 또한 이것을 시도해 보았지만 export PS1='[$(v0)][$(v1)][$(v2)][$(v3)]$'
그 역시 효과가 없었습니다. 나는 무엇을 해야할지 모르겠습니다!
CSV 파일 예:
Date_of_report;Municipality_code;Municipality_name;Province;Total_reported;Hospital_admission;Deceased
2020-03-13 10:00:00;GM0003;Appingedam;Groningen;0;0;0
2020-03-13 10:00:00;GM0010;Delfzijl;Groningen;0;0;0
2020-03-13 10:00:00;GM0014;Groningen;Groningen;3;0;0
2020-03-13 10:00:00;GM0024;Loppersum;Groningen;0;0;0
2020-03-13 10:00:00;GM0034;Almere;Flevoland;1;1;0
2020-03-13 10:00:00;GM0037;Stadskanaal;Groningen;0;0;0
2020-03-13 10:00:00;GM0047;Veendam;Groningen;0;0;0
2020-03-13 10:00:00;GM0050;Zeewolde;Flevoland;1;0;0
2020-03-13 10:00:00;GM0059;Achtkarspelen;Friesland;0;0;0
2020-03-13 10:00:00;GM0060;Ameland;Friesland;0;0;0
2020-03-13 10:00:00;GM0072;Harlingen;Friesland;0;0;0
2020-03-13 10:00:00;GM0074;Heerenveen;Friesland;0;0;0
답변1
현재 스크립트는 명시적으로 제공된 경우에만 프롬프트를 업데이트합니다. 프롬프트가 새로고침될 때마다 실행되도록 하려면 PROMPT_COMMAND
.
다음 수정된 스크립트를 사용해 보세요. 그러면 set_prompt
매번 프롬프트를 업데이트하는 함수가 호출됩니다 . 또한 새 메시지가 나타날 때 다시 실행하여 업데이트할 수 있도록 텍스트를 생성한 명령을 내보냈습니다. 예제 명령을 사용하면 . file.sh 0 2 "date -R"
Enter 키를 누르면 날짜 업데이트를 볼 수 있습니다.
#!/bin/bash
updatedata() {
v=$(awk -v strSearch="$1" '
BEGIN{
FS=";"
}
{
gsub(/\r/,"")
for(i=1;i<=NF;i++){
if($i==strSearch){ print i
exit
}
}
}
' data.csv)
sum=0
for x in `cut -f $v -d ';' data.csv`
do
x="${x/$'\r'/}"
let sum=$sum+$x
done
echo $sum
}
while [ "$#" -gt 0 ]; do
pos=$1
typevar=$2
stringvar=$3
case $pos in
0) v0=$3 ;;
1) v1=$3 ;;
2) v2=$3 ;;
3) v3=$3 ;;
*) echo "One of the values has invalid position entered, try again"
esac
case $typevar in
1) if [ $pos -eq 0 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT0="echo $stringvar"
else
export PROMPT0=""
fi
elif [ $pos -eq 1 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT1="echo $stringvar"
else
export PROMPT1=""
fi
elif [ $pos -eq 2 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT2="echo $stringvar"
else
export PROMPT2=""
fi
elif [ $pos -eq 3 ]
then
if [ "$stringvar" != "null" ]
then
export PROMPT3="echo $stringvar"
else
export PROMPT3=""
fi
fi ;;
2) if [ $pos -eq 0 ]
then
export PROMPT0="exec $3"
elif [ $pos -eq 1 ]
then
export PROMPT1="exec $3"
elif [ $pos -eq 2 ]
then
export PROMPT2="exec $3"
elif [ $pos -eq 3 ]
then
export PROMPT3="exec $3"
fi ;;
3) if [ $pos -eq 0 ]
then
export PROMPT0="updatedata $3"
elif [ $pos -eq 1 ]
then
export PROMPT1="updatedata $3"
elif [ $pos -eq 2 ]
then
export PROMPT2="updatedata $3"
elif [ $pos -eq 3 ]
then
export PROMPT3="updatedata $3"
fi ;;
*) echo "Invalid type of variable, try again"
esac
shift
shift
shift
done
function set_prompt() {
v0=$($PROMPT0)
v1=$($PROMPT1)
v2=$($PROMPT2)
v3=$($PROMPT3)
export PS1="[$v0][$v1][$v2][$v3]$"
}
export PROMPT_COMMAND=set_prompt