很多sh代码看起来像:
$cmd if [ $? = 0 ]; then $cmd2; fi
代替:
if $cmd; then $cmd2; fi
我通常认为人们使用前者只是因为他们不知道后者的语法是有效的,但我想知道是否还有另一个原因(尽管我想到的唯一可能性是可移植性).是否有理由更喜欢明确引用$ {?}?.
我希望以与在终端上运行命令时输出的格式相同的格式回显命令的输出,但出于某种原因,使用echo似乎消除了换行符.
例:
$ OUTPUT=$(git status)
$ echo $OUTPUT
# On branch feature_install # Untracked files: # (use "git add <file>..." to include in what will be committed) # # install/ nothing added to commit but untracked files present (use "git add" to track)
Run Code Online (Sandbox Code Playgroud)
但这应该打印出来:
$ git status
# On branch feature_install
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# install/
nothing added to commit but untracked files present (use "git add" …Run Code Online (Sandbox Code Playgroud) 目前我正在使用Cgo从Go调用C函数.我正试图在Go中重新创建"Read a Photo"示例.
然而,关于C函数的一个期望一个int* len论证(奖金问题;是否与int *len?相同).当我读到这个时,这是一个指向整数的指针.有问题的函数是ccv_writelibccv库.它的完整签名是:
int ccv_write(ccv_dense_matrix_t* mat, char* out, int* len, int type, void* conf)
相关的代码段如下:
type Image struct {
image *C.ccv_dense_matrix_t
}
func main() {
image := new(Image)
/* ... snip ... */
dst := C.CString("black_and_white_painting.jpg")
defer C.free(unsafe.Pointer(dst))
x := 0 // <- perhaps var x int ?
C.ccv_write(image.image, dst, (*C.int)(&x), C.CCV_IO_PNG_FILE, 0)
}
Run Code Online (Sandbox Code Playgroud)
上面的示例生成以下编译时错误: cannot convert &x (type *int) to type *_Ctype_int
关于如何传递正确论点的任何想法?
我有一个数组变量tht包含文件夹中的所有目录.我需要cd到$ array中的每个目录.当它到达不可访问的目录时,程序停止.如何避免这种情况,以便我的循环只是转到下一个目录.代码是
foreach dir ($array)
cd $dir
echo "directory is $dir"
cd - end
Run Code Online (Sandbox Code Playgroud)
请帮忙 !!
我想用制表符缩进 vim 中的所有内容,但特殊情况除外。例如,我有这个 C++ 代码(其中<tab>是制表符系列,<s>是空格字符系列):
<tab>if(true &&
<tab><s>true)
<tab>{
<tab><tab>//code here
<tab>}
Run Code Online (Sandbox Code Playgroud)
我想在写完 '&&' 并按 'o' 跳到下一行并开始编写以使 vim 放置一个制表符和空格数,直到 '(' 从前一行开始。
是否可以在 vim 中定义这种编码风格?
谢谢!
我有两个文件:
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
和一个有两列的文件
1 0.11
2 0.12748
5 0.45
12 0.48
7 0.48
8 0.7
13 0.78
14 0.88
Run Code Online (Sandbox Code Playgroud)
我想找到两个文件之间的相似之处.如果在两个文件中,文件1中的数字也在文件2的第一列中,则表示它必须出现在输出文件中.输出应该是:
1 0.11
2 0.12748
5 0.45
7 0.48
8 0.7
Run Code Online (Sandbox Code Playgroud)
我尝试使用不同的grep组合,但它不起作用.
这是意外情况:在以下脚本中,SIGALRM没有alarm()在预期时间调用该函数。
#!/bin/sh -x
alarm() {
echo "alarmed!!!"
}
trap alarm 14
OUTER=$(exec sh -c 'echo $PPID')
#for arg in `ls $0`; do
ls $0 | while read arg; do
INNER=$(exec sh -c 'echo $PPID')
# child A, the timer
sleep 1 && kill -s 14 $$ &
# child B, some other scripts
sleep 60 &
wait $!
done
Run Code Online (Sandbox Code Playgroud)
预期:1 秒后,alarm()应调用该函数。
实际上:
alarm()一直被调用直到 60 秒,或者当我们点击Ctrl+时C。
我们知道在脚本中,$$ …
我想写一个shell脚本,应该从这里调用一个函数文件,如下所示:
#!/bin/bash
funexit
funexit ()
{
exit 1
}
cat <<:EOD:
funexit
:EOD:
Run Code Online (Sandbox Code Playgroud)
请给我一个很好的解决方案!
我有一个包含文件名的fodler,其中包含空格.
我创建了一个替换空格的脚本,并使用_而不是""(空格)创建新文件名,并在for循环中运行mv命令.
这在脚本中没有用,并给我以下消息.
Usage: mv [-I] [ -d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src target
or: mv [-I] [-d | -e] [-i | -f] [-E{force|ignore|warn}] [--] src1 ... srcN directory
Run Code Online (Sandbox Code Playgroud)
但是如果我调试shell脚本并单独提取mv命令并运行它,它确实可以正常工作而没有任何问题.
生成的命令看起来像
mv "abc ddd eee.txt" abc_ddd_eee.txt
Run Code Online (Sandbox Code Playgroud)
你能否告诉我为什么在unix盒子上输入的命令工作正常而不是通过脚本?
整个脚本:
for i in *
do
v1=$(echo $i|sed -e 's/^/"/g' -e 's/$/"/g' )
v2=$(echo $v1|sed 's/ /_/g'|
awk -F "[-.]" '{print $2,"_",$1,".",$3}'|
sed 's/ //g'|
sed -e 's/^_//g' -e 's/"$//g'|
sed 's/"//2' )
mv $v1 $v2
done
Run Code Online (Sandbox Code Playgroud)