从变量使用HEREDOC时遇到问题。
我有一个脚本,运行良好,但我想让它基于ISROOT的值条件。如果ISROOT=0,那么sudo -i -u db2 inst 1 bash〈〈EOF不应该被调用,如果ISROOT=1,那么它应该被调用。
#!/bin/bash
set -x
DBNAME="SAMPLE"
ISROOT=1
if [[ $ISROOT == 1 ]]; then
DB2_PREFIX="sudo -i -u db2inst1 bash '<<' 'EOF' "
DB2_POSTFIX=" 'EOF' "
else
DB2_PREFIX=" "
DB2_POSTFIX=" "
fi
printf '\n\n%s\n\n' "Setting DB2_PREFIX: $DB2_PREFIX and DB2_POSTFIX: $DB2_POSTFIX"
sleep 5
whoami
OUTPUTFILE=$( echo "XX.wlm.$( date "+%Y%m%d_%H%M%S" )" )
{
sudo -i -u db2inst1 bash << EOF
echo "In"
whoami
db2 connect to $DBNAME
db2 -v "call WLM_SET_CLIENT_INFO( null, null, null, null, 'SYSDEFAULTADMWORKLOAD' )"
printf '\n\n%s\n\n' "Current state of queries"
db2 -v "SELECT current timestamp as timestamp, ACTIVITY_STATE, SUM(ADM_BYPASSED) AS BYPASSED, COUNT(*) AS ACTIVE_CONNS FROM TABLE(MON_GET_ACTIVITY(NULL,-2)) AS T WHERE T.MEMBER = T.COORD_MEMBER GROUP BY ACTIVITY_STATE"
EOF
} 2>&1 | tee $OUTPUTFILE
echo "Out"
whoami
但是,我的要求是仅在ISROOT == 1时使用sudo -i -u db2inst1 bash << EOF
所以我想做这样的事-
#!/bin/bash
set -x
DBNAME="SAMPLE"
ISROOT=1
if [[ $ISROOT == 1 ]]; then
DB2_PREFIX="sudo -i -u db2inst1 bash '<<' 'EOF' "
DB2_POSTFIX=" 'EOF' "
else
DB2_PREFIX=" "
DB2_POSTFIX=" "
fi
printf '\n\n%s\n\n' "Setting DB2_PREFIX: $DB2_PREFIX and DB2_POSTFIX: $DB2_POSTFIX"
sleep 5
whoami
OUTPUTFILE=$( echo "XX.wlm.$( date "+%Y%m%d_%H%M%S" )" )
{
$DB2_PREFIX
echo "In"
whoami
db2 connect to $DBNAME
db2 -v "call WLM_SET_CLIENT_INFO( null, null, null, null, 'SYSDEFAULTADMWORKLOAD' )"
printf '\n\n%s\n\n' "Current state of queries"
db2 -v "SELECT current timestamp as timestamp, ACTIVITY_STATE, SUM(ADM_BYPASSED) AS BYPASSED, COUNT(*) AS ACTIVE_CONNS FROM TABLE(MON_GET_ACTIVITY(NULL,-2)) AS T WHERE T.MEMBER = T.COORD_MEMBER GROUP BY ACTIVITY_STATE"
$DB2_POSTFIX
} 2>&1 | tee $OUTPUTFILE
echo "Out"
whoami
这不起作用,并抛出错误:
+ sudo -i -u db2inst1 bash ''\''<<' 'EOF'\'''
bash: '<<: No such file or directory
有人能帮帮忙吗。
我试过将EOF和〈〈放在单引号中,但仍然不起作用。
1条答案
按热度按时间i34xakig1#
仅当ISROOT == 1时,才使用sudo -i -u db2 inst 1 bash
很好,所以只在那时运行sudo。否则就运行bash。