当前位置:网站首页>Chapter 19 Tips and Traps: Common Goofs for Novices
Chapter 19 Tips and Traps: Common Goofs for Novices
2022-08-01 23:12:00 【Dreamer 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]ellDBA 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_delete1.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]$边栏推荐
- Postman batch test interface detailed tutorial
- chrome复制一张图片的base64数据
- 隔离和降级
- npm包【详解】(内含npm包的开发、发布、安装、更新、搜索、卸载、查看、版本号更新规则、package.json详解等)
- SRv6 L3VPN的工作原理
- The monthly salary of the test post is 5-9k, how to increase the salary to 25k?
- 如何使用pywinauto和pyautogui将动漫小姐姐链接请回家
- excel split text into different rows
- 问题解决方式了
- 软技能之UML图
猜你喜欢
随机推荐
excel split text into different rows
从0到100:招生报名小程序开发笔记
13、学习MySQL 分组
如何更好的理解的和做好工作?
npm包【详解】(内含npm包的开发、发布、安装、更新、搜索、卸载、查看、版本号更新规则、package.json详解等)
【C补充】链表专题 - 单向链表
浅析多服务在分布式系统下多事务通信处理机制方案
Background project Express-Mysql-Vue3-TS-Pinia page layout-sidebar menu
【SeaTunnel】从一个数据集成组件演化成企业级的服务
Graph Theory - Strongly Connected Component Condensation + Topological Sort
选择合适的 DevOps 工具,从理解 DevOps 开始
6134. 找到离给定两个节点最近的节点-力扣双百代码
perspectiveTransform warpPerspective getPerspectiveTransform findHomography
1391D. 505 状压dp
Calculate the distance between two points
excel change cell size
Codeforces CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!) A-D Solution
CAKE:一个用于多视图知识图谱补全的可扩展性常识感知框架
请问什么是 CICD
How to better understand and do a good job?









