ksh error "syntax error at line 5: `(' unexpected" - shell

I have a php file that print a number, and I want to use this number in my ksh file so I do this but it is not working.
#!/bin/sh
testt = $(php /path/to/count.php)
echo $testt
I want that the testt variable is assigned the number value.

The shell's tokenizer is white-space sensitive. Use
testt=$(php /path/to/count.php)
Note: no blanks around =.

Related

I would like to automate data extraction from an API and a for-loop using a Bash script but getting an error

#!/bin/bash
declare -a gpu_array=("rtx3060", "rtx3070", "rtx3080", "rtx3090", "rx6700")
#host = "http://192.168.1.31:5000/"
for gpu in ${gpu_array[*]}; do
gpu_url = $"http://192.168.1.31:5000/$gpu"
value = $(curl "${gpu_url}")
echo $value>> trial.txt
done
"""
trial.sh: line 8: value: command not found
trial.sh: line 7: gpu_url: command not found
curl: (3) URL using bad/illegal format or missing URL
trial.sh: line 8: value: command not found
trial.sh: line 7: gpu_url: command not found
curl: (3) URL using bad/illegal format or missing URL
trial.sh: line 8: value: command not found
"""
The array elements are separated by spaces, no commas. The double quotes are not needed, as the elements don't contain any special characters, but they don't hurt.
declare -a gpu_array=(rtx3060 rtx3070 rtx3080 rtx3090 rx6700)
Don't use $"...", it's used for localization. Plain "..." is enough here, in fact, you don't need any quotes here:
gpu_url=http://192.168.1.31:5000/$gpu
Note there are no spaces around the assignment operator. If you use spaces, bash takes the variable name as the command to run and = as its first parameter. That's not what you usually want.
gpu_url=http://192.168.1.31:5000/$gpu
value=$(curl "$gpu_url")
BTW, the standard way of iterating over the array would be
for gpu in "${gpu_array[#]}"; do
It'd work correctly even if the array elements contained spaces.
For the same reason, it's a good practice to always double quote the variables (unless you want to split the value on whitespace).
echo "$value"
This can still do something unexpected if the value is -n in some shells, so it's safer to use echo only for constant strings and use printf for dynamic contents.
printf '%s\n' "$value"

Call a function from an external script

I have 2 scripts:
/home/bin/test.sh
#!/bin/bash
. /home/bin/test_functions.sh
test
/home/bin/test_functions.sh
#!/bin/sh
test()
{
echo "this is a test"
}
I wanted to call the function from the external script and execute it in the main script. Yet I've been receiving these errors:
'home/bin/test_functions.sh: line 2: syntax error near unexpected token `
'home/bin/test_functions.sh: line 2: `test()
What could be wrong with what I'm doing?
It appears that test_functions.sh is in DOS format and bash is choking on the \r\n line endings. Use dos2unix to convert it to UNIX line endings.
You can tell because what bash is trying to output is this:
/home/bin/test_functions.sh: line 2: syntax error near unexpected token `\r'
/home/bin/test_functions.sh: line 2: `test()\r'
But the carriage returns \r cause the single quotes to end up at the beginning of the error messages, overwriting the leading /.

parameter expansion syntax bash

I am trying to write a short script that will take two command line parameters as file extensions and change all files with the first extension to have the second extension. I am pretty sure the following script should work but for some reason it gives me a syntax error on the line where the variable name is defined and I am not sure why. I am rather new to bash scripting so any help would be greatly appreciated!
for f in "*$1" do
name=${f%.*}
mv $f "$name$2"
done
The error message printed by Bash looks like:
./script: line 4: syntax error near unexpected token `name=${f%.*}'
./script: line 4: `name=${f%.*}'
The reason is that you are missing a ; or newline before do. Also you don't want to quote * in "*$1", since the * will be taken as a literal. Corrected script:
#!/usr/bin/env bash
for f in *"$1"; do
name=${f%.*}
mv "$f" "$name$2"
done

-bash: syntax error near unexpected token `)'

I'm probably missing something very basic. I have a web script that tells a shell script to update some database records. These records are for statistics, and this way the web script does not have to wait while the database records are updated. However, I can't actually make the shell script work running it from commandline. Here is the code that I'm trying:
perl async_sql.pl 'UPDATE some_table set i = i + 1 WHERE (n in (\'328430\',\'334969\',\'330179\',\'335290\',\'335285\',\'335284\',\'335264\',\'335145\',\'335146\',\'335147\',\'335148\',\'335149\',\'335230\',\'335201\',\'335198\',\'335196\',\'335167\',\'335151\',\'335152\',\'335143\',\'334969\',\'334972\',\'334977\',\'334978\',\'334979\',\'334980\',\'334982\',\'334983\',\'334984\',\'334934\',\'334947\',\'334948\',\'334950\',\'334992\',\'335014\',\'335026\',\'335030\',\'335032\',\'334864\',\'334862\',\'334861\',\'334858\',\'334855\',\'334852\',\'334850\',\'334849\',\'334848\',\'334847\',\'334844\',\'334842\'))'
Bash tells me:
-bash: syntax error near unexpected token `)'
What am I missing?
It is not possible to escape single quote in single quotes. Use " " instead
perl async_sql.pl "UPDATE some_table set i = i + 1 WHERE (n in ('328430','334969','330179','335290','335285','335284','335264','335145','335146','335147','335148','335149','335230','335201','335198','335196','335167','335151','335152','335143','334969','334972','334977','334978','334979','334980','334982','334983','334984','334934','334947','334948','334950','334992','335014','335026','335030','335032','334864','334862','334861','334858','334855','334852','334850','334849','334848','334847','334844','334842'))"
Also, there are other ways to deal with this problem:
echo "quote'test"
echo 'quote'"'"'test'
echo 'quote'\''test'
echo $'quote\'test'
All these should print quote'test as a single parameter. Which means that another great solution for your problem is:
perl async_sql.pl $'UPDATE some_table set i = i + 1 WHERE (n in (\'328430\',\'334969\',\'330179\',\'335290\',\'335285\',\'335284\',\'335264\',\'335145\',\'335146\',\'335147\',\'335148\',\'335149\',\'335230\',\'335201\',\'335198\',\'335196\',\'335167\',\'335151\',\'335152\',\'335143\',\'334969\',\'334972\',\'334977\',\'334978\',\'334979\',\'334980\',\'334982\',\'334983\',\'334984\',\'334934\',\'334947\',\'334948\',\'334950\',\'334992\',\'335014\',\'335026\',\'335030\',\'335032\',\'334864\',\'334862\',\'334861\',\'334858\',\'334855\',\'334852\',\'334850\',\'334849\',\'334848\',\'334847\',\'334844\',\'334842\'))'
I have only placed a dollar sign $ right before the parameter. That's it. A dollar sign before single quotes turns on ANSI-C Quoting
bash: syntax error near unexpected token `('
this type of error can be solve by the turn on extended globbing by git bash command is "shopt -s extglob"

How can I pass special characters [eg. " or ( or ' ] as arguments to shell script?

I got one error while passing the arguments to outlook_DataParsing.sh:
$ sh outlook_DataParsing.sh delete node doc('/opt/ws40/contacts.xml')//Directory/Contacts/Contact[#id='22222']
and I am reading all the arguments as:
str=$#
The error is following:
-bash: syntax error near unexpected token `('
Can anybody help me?
There are a number of "special" characters in a shell command, including $()[]
Most of these can simply be passed by enclosing the parameter in double quotes
foo "(hello)[]"
This however will not fix the $ sign, as it is intended for variables. You can instead use single quotes to pass a $ sign
foo '$im_not_a_variable'
If all else fails, ANY character can be escaped with a backslash \ including a space (no quotes needed)
foo \(hello\)\[\]\ \$im_not_a_variable

Resources