当前位置:网站首页>Chapter 19 Tips and Traps: Common Goofs for Novices
Chapter 19 Tips and Traps: Common Goofs for Novices
2022-08-01 22:59:00 【梦想家DBA】
1.1 Forgetting to Set Execute Permissions
First, you could invoke bash and give it the name of the script as a parameter:
Or second (and better still), you could set the execute permission on the script so that you can run it directly:
[[email protected] test]$ ./fun_calc.sh
-bash: ./fun_calc.sh: Permission denied
[[email protected] test]$ bash fun_calc.sh
[[email protected] test]$ chmod a+x fun_calc.sh
[[email protected] test]$ ./fun_calc.sh
[[email protected] test]$
1.2 Fixing "No such file or directory" Errors
[[email protected] Day0801]$ cat busted
#!/bin/bash -
echo "Hello World!"
[[email protected] Day0801]$ # This works
[[email protected] Day0801]$ ./busted
Hello World!
[[email protected] Day0801]$ # But if the file gets DOS line endings,we get:
[[email protected] Day0801]$ ./busted1
/bin/bash: will: No such file or directory
Hello World!
[[email protected] Day0801]$
1.3 Forgetting That the Current Directory Is Not in the $PATH
Either add the current directory to the $PATH variable, which we do not recommend, or reference the script via the current directory with a leading ./ before the script name, as in: $ ./busted
[[email protected] Day0801]$ busted
bash: busted: command not found
[[email protected] Day0801]$ ./busted
Hello World!
[[email protected] Day0801]$
1.4 Naming Your Script Test
[[email protected] Day0801]$ type test
test is a shell builtin
[[email protected] Day0801]$
1.5 Expecting to Change Exported Variables
[[email protected]xwellDBA Day0801]$ ./first.sh
VAL=5
in second
initially VAL=5
changed so VAL=12
back in first
VAL=5
[[email protected] Day0801]$ cat first.sh
#
# a simple example of a common mistake
#
# set the value:
export VAL=5
printf "VAL=%d\n" $VAL
#invoke our other script:
./second.sh
#
# now see what changed (hint:nothing!)
printf "%b" "back in first\n"
printf "VAL=%d\n" $VAL
[[email protected] Day0801]$ cat second.sh
#!/bin/bash
printf "%b" "in second\n"
printf "initially VAL=%d\n" $VAL
VAL=12
printf "changed so VAL=%d\n" $VAL
[[email protected] Day0801]$
and the second script has to echo the final value (and only the final value) to STDOUT (it could redirect its other messages to STDERR):
[[email protected] Day0801]$ ./first.sh
VAL=5
in second
initially VAL=5
changed so VAL=12
back in first
VAL=5
[[email protected] Day0801]$ cat first.sh
#
# a simple example of a common mistake
#
# set the value:
export VAL=5
printf "VAL=%d\n" $VAL
#invoke our other script:
./second.sh
#
# now see what changed (hint:nothing!)
printf "%b" "back in first\n"
printf "VAL=%d\n" $VAL
[[email protected] Day0801]$ cat second.sh
#!/bin/bash
printf "%b" "in second\n" >&2
printf "initially VAL=%d\n" $VAL >&2
VAL=12
printf "changed so VAL=%d\n" $VAL >&2
[[email protected] Day0801]$
1.6 Forgetting Quotes Leads to "command not found" on Assignments
You need quotes around the righthand side of the assignment to $ALLOPT. What is written above as: ALLOPT=$OPT1 $OPT2 really should be: ALLOPT="$OPT1 $OPT2"
[[email protected] Day0801]$ cat goof1.sh
#!/bin/bash -
# common goof:
# X=$Y $Z
# isn't the same as
# X="$Y $Z"
#
OPT1=-l
OPT2=-h
ALLOPT=$OPT1 $OPT2
ls $ALLOPT .
[[email protected] Day0801]$ chmod a+x goof1.sh
[[email protected] Day0801]$ ./goof1.sh
./goof1.sh: line 9: -h: command not found
busted busted1 dash.sh default_date.sh first.sh goof1.sh load_mp3.sh oodiff.sh second.sh
[[email protected] Day0801]$ cat goof1.sh
#!/bin/bash -
# common goof:
# X=$Y $Z
# isn't the same as
# X="$Y $Z"
#
OPT1=-l
OPT2=-h
ALLOPT="$OPT1 $OPT2"
ls $ALLOPT .
[[email protected] Day0801]$ ./goof1.sh
total 36K
-rwxrwxr-x 1 maxwell maxwell 34 Aug 1 19:33 busted
-rwxrwxr-x 1 maxwell maxwell 58 Aug 1 19:39 busted1
-rw-rw-r-- 1 maxwell maxwell 595 Aug 1 13:27 dash.sh
-rw-rw-r-- 1 maxwell maxwell 915 Aug 1 08:11 default_date.sh
-rwxrwxr-x 1 maxwell maxwell 228 Aug 1 19:49 first.sh
-rwxrwxr-x 1 maxwell maxwell 123 Aug 1 19:59 goof1.sh
-rw-rw-r-- 1 maxwell maxwell 1.4K Aug 1 13:49 load_mp3.sh
-rw-rw-r-- 1 maxwell maxwell 1.3K Aug 1 13:58 oodiff.sh
-rwxrwxr-x 1 maxwell maxwell 145 Aug 1 19:54 second.sh
[[email protected] Day0801]$
1.10 Deleting Files Using an Empty Variable
Never do:
rm -rf $files_to_delete
Never, ever, ever do:
rm -rf /$files_to_delete
Use this instead:
[ "$files_to_delete" ] && rm -rf $files_to_delete
1.11 Seeing Odd Behavior from printf
[[email protected] Day0801]$ cat oddscript
#!/bin/bash -
badnode=6
printf "good nodes: %d\n" $goodnode
printf "bad nodes: %d\n" $badnode
printf "miss nodes: %d\n" $missnode
printf "GOOD=%d BAD=%d MISS=%d\n" $goodnode $badnode $missnode
[[email protected] Day0801]$ bash oddscript
good nodes: 0
bad nodes: 6
miss nodes: 0
GOOD=6 BAD=0 MISS=0
[[email protected] Day0801]$
1.13 Debugging Scripts
Add set -x to the top of the script when you run it. Or use set -x to turn on xtrace before a troublesome spot and set +x to turn it off after.
[[email protected] Day0801]$ cat buggy
#!/usr/bin/env bash
# cookbook filename: buggy
#
set -x
result=$1
[ $result = 1 ] \
&& { echo "Result is 1; excellent." ; exit 0; } \
|| { echo "Uh-oh, ummm, RUN AWAY! " ; exit 120; }
Now we invoke this script, but first we set and export the value of the PS4 prompt. bash will print out the value of PS4 before each command that it displays during an execution trace (i.e., after a set -x ):
[[email protected] Day0801]$ cat buggy
#!/usr/bin/env bash
# cookbook filename: buggy
#
set -x
result=$1
[ $result = 1 ] \
&& { echo "Result is 1; excellent." ; exit 0; } \
|| { echo "Uh-oh, ummm, RUN AWAY! " ; exit 120; }
[[email protected] Day0801]$ export PS4='+trace $LINENO:'
[[email protected] Day0801]$ echo $PS4
+trace $LINENO:
[[email protected] Day0801]$ chmod a+x buggy
[[email protected] Day0801]$ ./buggy
+trace 6:result=
+trace 8:'[' = 1 ']'
./buggy: line 8: [: =: unary operator expected
+trace 10:echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!
+trace 10:exit 120
[[email protected] Day0801]$ ./buggy 1
+trace 6:result=1
+trace 8:'[' 1 = 1 ']'
+trace 9:echo 'Result is 1; excellent.'
Result is 1; excellent.
+trace 9:exit 0
[[email protected] Day0801]$ ./buggy 2
+trace 6:result=2
+trace 8:'[' 2 = 1 ']'
+trace 10:echo 'Uh-oh, ummm, RUN AWAY! '
Uh-oh, ummm, RUN AWAY!
+trace 10:exit 120
[[email protected] Day0801]$
边栏推荐
- 解决 win10 下 ISE14.7的 iMPACT 崩溃问题 - FPGA 笔记
- System availability: 3 9s, 4 9s in SRE's mouth... What is it?
- String - Trie
- excel vertical to horizontal
- 字符串——Trie
- excel edit a cell without double clicking
- Create virtual environments with virtualenv and Virtualenvwrapper virtual environment management tools
- AQS
- Codeforces CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) A-D 题解
- 美赞臣EDI 940仓库装运订单详解
猜你喜欢
牛客多校4 A.Task Computing 思维
还在纠结报表工具的选型么?来看看这个
y84.第四章 Prometheus大厂监控体系及实战 -- prometheus告警机制进阶(十五)
Use Jenkins for continuous integration, this knowledge point must be mastered
seaborn笔记:可视化统计关系(散点图、折线图)
No more rolls!After joining ByteDance for a week, he ran decisively.
使用Jenkins做持续集成,这个知识点必须要掌握
小程序中的多表联合查询
解决yolov5训练时出现:“AssertionError: train: No labels in VOCData/dataSet_path/train.cache. Can not train ”
2022 edition of MySQL tutorial, top collection good, take your time
随机推荐
小程序毕设作品之微信体育馆预约小程序毕业设计成品(2)小程序功能
【SeaTunnel】从一个数据集成组件演化成企业级的服务
Three, mysql storage engine - building database and table operation
数据增强--学习笔记(图像类,cnn)
JS 数组去重(含简单数组去重、对象数组去重)
more grown, more lonely
How to prevent governance attacks in DAOs?
10年稳定性保障经验总结,故障复盘要回答哪三大关键问题?|TakinTalks大咖分享
y84.第四章 Prometheus大厂监控体系及实战 -- prometheus告警机制进阶(十五)
从0到1:图文投票小程序设计与研发笔记
华为无线设备配置双链路冷备份(AP指定配置方式)
使用分类权重解决数据不平衡的问题
如何给 UE4 场景添加游戏角色
2022-08-01 第八组 曹雨 泛型 枚举
使用 Zokrates 在 BSV 上创建您的第一个 zkSNARK 证明
PAM 回文自动机
xctf attack and defense world web master advanced area web2
selenium无头,防检测
编曲软件FL studio20.8中文版功能和作用
Use Jenkins for continuous integration, this knowledge point must be mastered